• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bundle_data_mgr.h"
17 
18 #include <sys/stat.h>
19 
20 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
21 #ifdef ACCOUNT_ENABLE
22 #include "os_account_info.h"
23 #endif
24 #endif
25 #include "account_helper.h"
26 #include "app_log_tag_wrapper.h"
27 #include "app_provision_info_manager.h"
28 #include "bms_extension_client.h"
29 #include "bundle_data_storage_rdb.h"
30 #include "preinstall_data_storage_rdb.h"
31 #include "bundle_event_callback_death_recipient.h"
32 #include "bundle_mgr_service.h"
33 #include "bundle_mgr_client.h"
34 #include "bundle_parser.h"
35 #include "bundle_permission_mgr.h"
36 #include "bundle_status_callback_death_recipient.h"
37 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
38 #include "default_app_mgr.h"
39 #endif
40 #include "hitrace_meter.h"
41 #include "inner_bundle_clone_common.h"
42 #include "installd_client.h"
43 #include "ipc_skeleton.h"
44 #ifdef GLOBAL_I18_ENABLE
45 #include "locale_config.h"
46 #include "locale_info.h"
47 #endif
48 #include "mime_type_mgr.h"
49 #include "parameters.h"
50 #include "router_map_helper.h"
51 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
52 #include "bundle_overlay_data_manager.h"
53 #endif
54 #include "bundle_extractor.h"
55 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
56 #include "type_descriptor.h"
57 #include "utd_client.h"
58 #endif
59 
60 #ifdef APP_DOMAIN_VERIFY_ENABLED
61 #include "app_domain_verify_mgr_client.h"
62 #endif
63 
64 #include "shortcut_data_storage_rdb.h"
65 #include "system_ability_definition.h"
66 #include "system_ability_helper.h"
67 #include "ohos_account_kits.h"
68 
69 namespace OHOS {
70 namespace AppExecFwk {
71 namespace {
72 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
73 constexpr int32_t DATA_GROUP_INDEX_START = 1;
74 constexpr int32_t UUID_LENGTH = 36;
75 constexpr int32_t PROFILE_PREFIX_LENGTH = 9;
76 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
77 // freeInstall action
78 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
79 // share action
80 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
81 const std::string WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
82 const std::string SUMMARY_TOTAL_COUNT = "totalCount";
83 const std::string WANT_PARAM_SUMMARY = "summary";
84 constexpr int32_t DEFAULT_SUMMARY_COUNT = 0;
85 // data share
86 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
87 constexpr int32_t DATA_PROXY_URI_PREFIX_LEN = 17;
88 // profile path
89 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
90 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
91 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
92 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
93 constexpr const char* PKG_CONTEXT_PROFILE_PATH = "pkgContextInfo.json";
94 constexpr const char* PROFILE_PATH = "resources/base/profile/";
95 constexpr const char* PROFILE_PREFIX = "$profile:";
96 constexpr const char* JSON_SUFFIX = ".json";
97 constexpr const char* SCHEME_HTTPS = "https";
98 constexpr const char* PERMISSION_PROTECT_SCREEN_LOCK_DATA = "ohos.permission.PROTECT_SCREEN_LOCK_DATA";
99 constexpr const char* META_DATA_SHORTCUTS_NAME = "ohos.ability.shortcuts";
100 constexpr const char* BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
101 constexpr const char* ENTRY = "entry";
102 constexpr const char* CLONE_BUNDLE_PREFIX = "clone_";
103 
104 const std::map<ProfileType, const char*> PROFILE_TYPE_MAP = {
105     { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
106     { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
107     { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
108     { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH },
109     { ProfileType::PKG_CONTEXT_PROFILE, PKG_CONTEXT_PROFILE_PATH }
110 };
111 const std::string SCHEME_END = "://";
112 const std::string LINK_FEATURE = "linkFeature";
113 const std::string ATOMIC_SERVICE_DIR_PREFIX = "+auid-";
114 const std::string CLONE_APP_DIR_PREFIX = "+clone-";
115 const std::string PLUS = "+";
116 constexpr const char* PARAM_URI_SEPARATOR = ":///";
117 constexpr const char* URI_SEPARATOR = "://";
118 constexpr uint32_t PARAM_URI_SEPARATOR_LEN = 4;
119 constexpr int32_t INVALID_BUNDLEID = -1;
120 constexpr int32_t DATA_GROUP_UID_OFFSET = 100000;
121 constexpr int32_t MAX_APP_UID = 65535;
122 constexpr int8_t ONLY_ONE_USER = 1;
123 }
124 
BundleDataMgr()125 BundleDataMgr::BundleDataMgr()
126 {
127     InitStateTransferMap();
128     dataStorage_ = std::make_shared<BundleDataStorageRdb>();
129     preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
130     sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
131     bundleStateStorage_ = std::make_shared<BundleStateStorage>();
132     shortcutStorage_ = std::make_shared<ShortcutDataStorageRdb>();
133     uninstallDataMgr_ = std::make_shared<UninstallDataMgrStorageRdb>();
134     baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
135     if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) {
136         baseAppUid_ = Constants::BASE_APP_UID;
137     }
138     APP_LOGI("BundleDataMgr instance is created");
139 }
140 
~BundleDataMgr()141 BundleDataMgr::~BundleDataMgr()
142 {
143     APP_LOGI("BundleDataMgr instance is destroyed");
144     installStates_.clear();
145     transferStates_.clear();
146     bundleInfos_.clear();
147 }
148 
LoadDataFromPersistentStorage()149 bool BundleDataMgr::LoadDataFromPersistentStorage()
150 {
151     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
152     // Judge whether bundleState json db exists.
153     // If it does not exist, create it and return the judgment result.
154     bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
155     if (!dataStorage_->LoadAllData(bundleInfos_)) {
156         APP_LOGW("LoadAllData failed");
157         return false;
158     }
159 
160     if (bundleInfos_.empty()) {
161         APP_LOGW("persistent data is empty");
162         return false;
163     }
164 
165     for (const auto &item : bundleInfos_) {
166         std::lock_guard<std::mutex> stateLock(stateMutex_);
167         installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
168         AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
169     }
170 
171     RestoreUidAndGid();
172     if (!bundleStateDbExist) {
173         // Compatible old bundle status in kV db
174         CompatibleOldBundleStateInKvDb();
175     } else {
176         ResetBundleStateData();
177         // Load all bundle status from json db.
178         LoadAllBundleStateDataFromJsonDb();
179     }
180 
181     SetInitialUserFlag(true);
182 
183     RestoreSandboxUidAndGid(bundleIdMap_);
184     return true;
185 }
186 
CompatibleOldBundleStateInKvDb()187 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
188 {
189     for (auto& bundleInfoItem : bundleInfos_) {
190         for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
191             auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
192             if (bundleUserInfo.IsInitialState()) {
193                 continue;
194             }
195 
196             // save old bundle state to json db
197             bundleStateStorage_->SaveBundleStateStorage(
198                 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
199         }
200     }
201 }
202 
LoadAllBundleStateDataFromJsonDb()203 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
204 {
205     APP_LOGD("Load all bundle state start");
206     std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
207     if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
208         APP_LOGW("Load all bundle state failed");
209         return;
210     }
211 
212     for (auto& bundleState : bundleStateInfos) {
213         auto infoItem = bundleInfos_.find(bundleState.first);
214         if (infoItem == bundleInfos_.end()) {
215             APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
216             continue;
217         }
218 
219         InnerBundleInfo& newInfo = infoItem->second;
220         for (auto& bundleUserState : bundleState.second) {
221             auto& tempUserInfo = bundleUserState.second;
222             newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.second.setEnabledCaller,
223                 bundleUserState.first);
224             for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
225                 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
226             }
227         }
228     }
229 
230     APP_LOGD("Load all bundle state end");
231 }
232 
ResetBundleStateData()233 void BundleDataMgr::ResetBundleStateData()
234 {
235     for (auto& bundleInfoItem : bundleInfos_) {
236         bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
237     }
238 }
239 
UpdateBundleInstallState(const std::string & bundleName,const InstallState state)240 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName, const InstallState state)
241 {
242     if (bundleName.empty()) {
243         APP_LOGW("update result:fail, reason:bundle name is empty");
244         return false;
245     }
246     // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
247     std::unique_lock<std::shared_mutex> lck(bundleInfoMutex_);
248     std::lock_guard<std::mutex> lock(stateMutex_);
249     auto item = installStates_.find(bundleName);
250     if (item == installStates_.end()) {
251         if (state == InstallState::INSTALL_START) {
252             installStates_.emplace(bundleName, state);
253             APP_LOGD("update result:success, state:INSTALL_START");
254             return true;
255         }
256         APP_LOGW("update result:fail, reason:incorrect state, bundleName: %{public}s", bundleName.c_str());
257         return false;
258     }
259 
260     auto stateRange = transferStates_.equal_range(state);
261     for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
262         if (item->second == previousState->second) {
263             APP_LOGD("update result:success, current:%{public}d, state:%{public}d", previousState->second, state);
264             if (IsDeleteDataState(state)) {
265                 installStates_.erase(item);
266                 DeleteBundleInfo(bundleName, state);
267                 return true;
268             }
269             item->second = state;
270             return true;
271         }
272     }
273     APP_LOGW("bundleName: %{public}s, update result:fail, reason:incorrect current:%{public}d, state:%{public}d",
274         bundleName.c_str(), item->second, state);
275     return false;
276 }
277 
AddInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)278 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
279 {
280     APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
281     if (bundleName.empty()) {
282         APP_LOGW("save info fail, empty bundle name");
283         return false;
284     }
285 
286     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
287     auto infoItem = bundleInfos_.find(bundleName);
288     if (infoItem != bundleInfos_.end()) {
289         APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
290         return false;
291     }
292     std::lock_guard<std::mutex> stateLock(stateMutex_);
293     auto statusItem = installStates_.find(bundleName);
294     if (statusItem == installStates_.end()) {
295         APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
296         return false;
297     }
298     if (statusItem->second == InstallState::INSTALL_START) {
299         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
300         if (info.GetBaseApplicationInfo().needAppDetail) {
301             AddAppDetailAbilityInfo(info);
302         }
303 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
304         if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
305             InnerBundleInfo newInfo = info;
306             std::string targetBundleName = newInfo.GetTargetBundleName();
307             auto targetInfoItem = bundleInfos_.find(targetBundleName);
308             if (targetInfoItem != bundleInfos_.end()) {
309                 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
310                 // storage target bundle info
311                 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
312             }
313         }
314         if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
315             info.SetOverlayModuleState(info.GetCurrentModulePackage(), OverlayState::OVERLAY_INVALID,
316                 info.GetUserId());
317         }
318         if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
319             // build overlay connection for external overlay
320             BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
321         }
322 #endif
323         bundleInfos_.emplace(bundleName, info);
324         AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
325         return true;
326     }
327     return false;
328 }
329 
AddNewModuleInfo(const std::string & bundleName,const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)330 bool BundleDataMgr::AddNewModuleInfo(
331     const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
332 {
333     APP_LOGD("add new module info module name %{public}s ", newInfo.GetCurrentModulePackage().c_str());
334     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
335     auto infoItem = bundleInfos_.find(bundleName);
336     if (infoItem == bundleInfos_.end()) {
337         APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
338         return false;
339     }
340     std::lock_guard<std::mutex> stateLock(stateMutex_);
341     auto statusItem = installStates_.find(bundleName);
342     if (statusItem == installStates_.end()) {
343         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
344         return false;
345     }
346     if (statusItem->second == InstallState::UPDATING_SUCCESS) {
347         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
348         ProcessAllowedAcls(newInfo, oldInfo);
349         if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
350             oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
351             oldInfo.UpdateBaseApplicationInfo(newInfo.GetBaseApplicationInfo(), newInfo.HasEntry());
352             oldInfo.UpdateRemovable(newInfo.IsPreInstallApp(), newInfo.IsRemovable());
353             oldInfo.UpdateMultiAppMode(newInfo);
354             oldInfo.UpdateReleaseType(newInfo);
355             oldInfo.SetAppType(newInfo.GetAppType());
356             oldInfo.SetAppFeature(newInfo.GetAppFeature());
357         }
358         if (oldInfo.GetOldAppIds().empty()) {
359             oldInfo.AddOldAppId(oldInfo.GetAppId());
360         }
361         oldInfo.SetProvisionId(newInfo.GetProvisionId());
362         oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
363         oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
364         oldInfo.SetCertificate(newInfo.GetCertificate());
365         oldInfo.AddOldAppId(newInfo.GetAppId());
366         oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
367         oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
368         oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
369         oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
370         oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
371         oldInfo.AddModuleInfo(newInfo);
372         oldInfo.UpdateAppDetailAbilityAttrs();
373         if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
374             AddAppDetailAbilityInfo(oldInfo);
375         }
376         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
377         oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
378         oldInfo.UpdateOdidByBundleInfo(newInfo);
379         oldInfo.SetAsanEnabled(oldInfo.IsAsanEnabled());
380         oldInfo.SetGwpAsanEnabled(oldInfo.IsGwpAsanEnabled());
381         oldInfo.SetTsanEnabled(oldInfo.IsTsanEnabled());
382         oldInfo.SetHwasanEnabled(oldInfo.IsHwasanEnabled());
383 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
384         if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
385             oldInfo.SetOverlayType(newInfo.GetOverlayType());
386         }
387         if (!UpdateOverlayInfo(newInfo, oldInfo)) {
388             APP_LOGD("bundleName: %{public}s : update overlay info failed", bundleName.c_str());
389             return false;
390         }
391 #endif
392         APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
393         bundleInfos_.at(bundleName) = oldInfo;
394         return true;
395     }
396     return false;
397 }
398 
RemoveModuleInfo(const std::string & bundleName,const std::string & modulePackage,InnerBundleInfo & oldInfo,bool needSaveStorage)399 bool BundleDataMgr::RemoveModuleInfo(
400     const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo, bool needSaveStorage)
401 {
402     APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
403     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
404     auto infoItem = bundleInfos_.find(bundleName);
405     if (infoItem == bundleInfos_.end()) {
406         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
407         return false;
408     }
409     std::lock_guard<std::mutex> stateLock(stateMutex_);
410     auto statusItem = installStates_.find(bundleName);
411     if (statusItem == installStates_.end()) {
412         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
413         return false;
414     }
415     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
416         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
417 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
418         std::string targetBundleName = oldInfo.GetTargetBundleName();
419         InnerBundleInfo targetInnerBundleInfo;
420         if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
421             targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
422         }
423         OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
424             targetInnerBundleInfo);
425         if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
426             // save target innerBundleInfo
427             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
428                 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
429                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
430             }
431         }
432         // remove target module and overlay module state will change to OVERLAY_INVALID
433         if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
434             ResetExternalOverlayModuleState(bundleName, modulePackage);
435         }
436 #endif
437         oldInfo.RemoveModuleInfo(modulePackage);
438         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
439         if (!oldInfo.isExistedOverlayModule()) {
440             oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
441         }
442         oldInfo.SetAsanEnabled(oldInfo.IsAsanEnabled());
443         oldInfo.SetGwpAsanEnabled(oldInfo.IsGwpAsanEnabled());
444         oldInfo.SetTsanEnabled(oldInfo.IsTsanEnabled());
445         oldInfo.SetHwasanEnabled(oldInfo.IsHwasanEnabled());
446         if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(oldInfo)) {
447             APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
448             return false;
449         }
450         bundleInfos_.at(bundleName) = oldInfo;
451         APP_LOGD("after delete modulePackage:%{public}s info", modulePackage.c_str());
452     }
453     return true;
454 }
455 
UpdateUninstallBundleInfo(const std::string & bundleName,const UninstallBundleInfo & uninstallBundleInfo)456 bool BundleDataMgr::UpdateUninstallBundleInfo(const std::string &bundleName,
457     const UninstallBundleInfo &uninstallBundleInfo)
458 {
459     if (uninstallDataMgr_ == nullptr) {
460         APP_LOGE("rdbDataManager is null");
461         return false;
462     }
463     if (bundleName.empty() || uninstallBundleInfo.userInfos.empty()) {
464         APP_LOGE("param error");
465         return false;
466     }
467     UninstallBundleInfo oldUninstallBundleInfo;
468     if (uninstallDataMgr_->GetUninstallBundleInfo(bundleName, oldUninstallBundleInfo)) {
469         std::string newUser = uninstallBundleInfo.userInfos.begin()->first;
470         if (oldUninstallBundleInfo.userInfos.find(newUser) != oldUninstallBundleInfo.userInfos.end()) {
471             APP_LOGE("u %{public}s has been saved", newUser.c_str());
472             return false;
473         }
474         oldUninstallBundleInfo.userInfos[newUser] = uninstallBundleInfo.userInfos.begin()->second;
475         return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, oldUninstallBundleInfo);
476     }
477     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
478 }
479 
GetUninstallBundleInfo(const std::string & bundleName,UninstallBundleInfo & uninstallBundleInfo)480 bool BundleDataMgr::GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)
481 {
482     if (uninstallDataMgr_ == nullptr) {
483         APP_LOGE("rdbDataManager is null");
484         return false;
485     }
486     if (bundleName.empty()) {
487         APP_LOGE("param error");
488         return false;
489     }
490     return uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo);
491 }
492 
DeleteUninstallBundleInfo(const std::string & bundleName,int32_t userId)493 bool BundleDataMgr::DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)
494 {
495     if (uninstallDataMgr_ == nullptr) {
496         APP_LOGE("rdbDataManager is null");
497         return false;
498     }
499     if (bundleName.empty()) {
500         APP_LOGE("param error");
501         return false;
502     }
503     UninstallBundleInfo uninstallBundleInfo;
504     if (!uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo)) {
505         APP_LOGE("bundle %{public}s is not found", bundleName.c_str());
506         return false;
507     }
508     auto it = uninstallBundleInfo.userInfos.find(std::to_string(userId));
509     if (it == uninstallBundleInfo.userInfos.end()) {
510         APP_LOGE("user %{public}d is not found", userId);
511         return false;
512     }
513     uninstallBundleInfo.userInfos.erase(std::to_string(userId));
514     if (uninstallBundleInfo.userInfos.empty()) {
515         return uninstallDataMgr_->DeleteUninstallBundleInfo(bundleName);
516     }
517     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
518 }
519 
RemoveHspModuleByVersionCode(int32_t versionCode,InnerBundleInfo & info)520 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
521 {
522     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
523     std::string bundleName = info.GetBundleName();
524     auto infoItem = bundleInfos_.find(bundleName);
525     if (infoItem == bundleInfos_.end()) {
526         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
527         return false;
528     }
529     std::lock_guard<std::mutex> stateLock(stateMutex_);
530     auto statusItem = installStates_.find(bundleName);
531     if (statusItem == installStates_.end()) {
532         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
533         return false;
534     }
535     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
536         info.DeleteHspModuleByVersion(versionCode);
537         info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
538         if (dataStorage_->SaveStorageBundleInfo(info)) {
539             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
540             bundleInfos_.at(bundleName) = info;
541             return true;
542         }
543     }
544     return true;
545 }
546 
AddInnerBundleUserInfo(const std::string & bundleName,const InnerBundleUserInfo & newUserInfo)547 bool BundleDataMgr::AddInnerBundleUserInfo(
548     const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
549 {
550     APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
551     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
552     auto infoItem = bundleInfos_.find(bundleName);
553     if (infoItem == bundleInfos_.end()) {
554         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
555         return false;
556     }
557 
558     std::lock_guard<std::mutex> stateLock(stateMutex_);
559     auto& info = bundleInfos_.at(bundleName);
560     info.AddInnerBundleUserInfo(newUserInfo);
561     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
562     if (!dataStorage_->SaveStorageBundleInfo(info)) {
563         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
564         return false;
565     }
566     return true;
567 }
568 
RemoveInnerBundleUserInfo(const std::string & bundleName,int32_t userId)569 bool BundleDataMgr::RemoveInnerBundleUserInfo(
570     const std::string &bundleName, int32_t userId)
571 {
572     APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
573     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
574     auto infoItem = bundleInfos_.find(bundleName);
575     if (infoItem == bundleInfos_.end()) {
576         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
577         return false;
578     }
579 
580     std::lock_guard<std::mutex> stateLock(stateMutex_);
581     auto& info = bundleInfos_.at(bundleName);
582     info.RemoveInnerBundleUserInfo(userId);
583     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
584     if (!dataStorage_->SaveStorageBundleInfo(info)) {
585         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
586         return false;
587     }
588 
589     bundleStateStorage_->DeleteBundleState(bundleName, userId);
590     return true;
591 }
592 
UpdateInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)593 bool BundleDataMgr::UpdateInnerBundleInfo(
594     const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
595 {
596     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
597     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
598     auto infoItem = bundleInfos_.find(bundleName);
599     if (infoItem == bundleInfos_.end()) {
600         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
601         return false;
602     }
603     std::lock_guard<std::mutex> stateLock(stateMutex_);
604     auto statusItem = installStates_.find(bundleName);
605     if (statusItem == installStates_.end()) {
606         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
607         return false;
608     }
609     // ROLL_BACK and USER_CHANGE should not be here
610     if (statusItem->second == InstallState::UPDATING_SUCCESS
611         || statusItem->second == InstallState::ROLL_BACK
612         || statusItem->second == InstallState::USER_CHANGE) {
613         APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
614             bundleName.c_str(), newInfo.GetCurrentModulePackage().c_str());
615         if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
616             oldInfo.KeepOldOverlayConnection(newInfo);
617         }
618         ProcessAllowedAcls(newInfo, oldInfo);
619         oldInfo.UpdateModuleInfo(newInfo);
620         oldInfo.SetAsanEnabled(oldInfo.IsAsanEnabled());
621         oldInfo.SetGwpAsanEnabled(oldInfo.IsGwpAsanEnabled());
622         oldInfo.SetTsanEnabled(oldInfo.IsTsanEnabled());
623         oldInfo.SetHwasanEnabled(oldInfo.IsHwasanEnabled());
624         // 1.exist entry, update entry.
625         // 2.only exist feature, update feature.
626         if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
627             oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
628             oldInfo.UpdateBaseApplicationInfo(
629                 newInfo.GetBaseApplicationInfo(), newInfo.HasEntry());
630             oldInfo.UpdateRemovable(
631                 newInfo.IsPreInstallApp(), newInfo.IsRemovable());
632             oldInfo.SetAppType(newInfo.GetAppType());
633             oldInfo.SetAppFeature(newInfo.GetAppFeature());
634             oldInfo.UpdateMultiAppMode(newInfo);
635             oldInfo.UpdateReleaseType(newInfo);
636         }
637         oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
638         if (oldInfo.GetOldAppIds().empty()) {
639             oldInfo.AddOldAppId(oldInfo.GetAppId());
640         }
641         oldInfo.AddOldAppId(newInfo.GetAppId());
642         oldInfo.SetProvisionId(newInfo.GetProvisionId());
643         oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
644         oldInfo.SetCertificate(newInfo.GetCertificate());
645         oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
646         oldInfo.UpdateAppDetailAbilityAttrs();
647         oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
648         if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
649             AddAppDetailAbilityInfo(oldInfo);
650         }
651         oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
652         oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
653         oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
654         if (newInfo.GetAppCrowdtestDeadline() != Constants::INHERIT_CROWDTEST_DEADLINE) {
655             oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
656         }
657         oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
658         // clear apply quick fix frequency
659         oldInfo.ResetApplyQuickFixFrequency();
660         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
661         oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
662         oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
663         oldInfo.UpdateOdidByBundleInfo(newInfo);
664 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
665         if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
666             if (!UpdateOverlayInfo(newInfo, oldInfo)) {
667                 APP_LOGD("update overlay info failed");
668                 return false;
669             }
670         }
671 
672         if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
673             APP_LOGD("update overlay info failed");
674             return false;
675         }
676 #endif
677         APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
678         bundleInfos_.at(bundleName) = oldInfo;
679         return true;
680     }
681     return false;
682 }
683 
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const684 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
685     int32_t appIndex) const
686 {
687     int32_t requestUserId = GetUserId(userId);
688     if (requestUserId == Constants::INVALID_USERID) {
689         APP_LOGE("request user id is invalid");
690         return false;
691     }
692 
693     ElementName element = want.GetElement();
694     std::string bundleName = element.GetBundleName();
695     std::string abilityName = element.GetAbilityName();
696     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfo bundleName:%{public}s abilityName:%{public}s",
697         bundleName.c_str(), abilityName.c_str());
698     // explicit query
699     if (!bundleName.empty() && !abilityName.empty()) {
700         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
701         if (!ret) {
702             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d"
703                 " -i %{public}d", bundleName.c_str(), abilityName.c_str(), userId, appIndex);
704             return false;
705         }
706         return true;
707     }
708     std::vector<AbilityInfo> abilityInfos;
709     bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
710     if (!ret) {
711         LOG_D(BMS_TAG_QUERY,
712             "implicit queryAbilityInfos error action:%{public}s uri:%{private}s type:%{public}s",
713             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
714         return false;
715     }
716     if (abilityInfos.size() == 0) {
717         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s",
718             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
719         return false;
720     }
721     abilityInfo = abilityInfos[0];
722     return true;
723 }
724 
GetCloneAbilityInfos(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const725 void BundleDataMgr::GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos,
726     const ElementName &element, int32_t flags, int32_t userId) const
727 {
728     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
729     if (cloneAppIndexes.empty()) {
730         APP_LOGI("clone app index is empty");
731         return;
732     }
733     for (int32_t appIndex: cloneAppIndexes) {
734         AbilityInfo cloneAbilityInfo;
735         bool ret = ExplicitQueryCloneAbilityInfo(element, flags, userId, appIndex, cloneAbilityInfo);
736         if (ret) {
737             abilityInfos.emplace_back(cloneAbilityInfo);
738         }
739     }
740 }
741 
GetCloneAbilityInfosV9(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const742 void BundleDataMgr::GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos,
743     const ElementName &element, int32_t flags, int32_t userId) const
744 {
745     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
746     if (cloneAppIndexes.empty()) {
747         APP_LOGI("clone app index is empty");
748         return;
749     }
750     for (int32_t appIndex: cloneAppIndexes) {
751         AbilityInfo cloneAbilityInfo;
752         ErrCode ret = ExplicitQueryCloneAbilityInfoV9(element, flags, userId, appIndex, cloneAbilityInfo);
753         if (ret == ERR_OK) {
754             abilityInfos.emplace_back(cloneAbilityInfo);
755         }
756     }
757 }
758 
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const759 bool BundleDataMgr::QueryAbilityInfos(
760     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
761 {
762     int32_t requestUserId = GetUserId(userId);
763     if (requestUserId == Constants::INVALID_USERID) {
764         APP_LOGE("request user id is invalid");
765         return false;
766     }
767 
768     ElementName element = want.GetElement();
769     std::string bundleName = element.GetBundleName();
770     std::string abilityName = element.GetAbilityName();
771     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfos bundleName:%{public}s abilityName:%{public}s",
772         bundleName.c_str(), abilityName.c_str());
773     // explicit query
774     if (!bundleName.empty() && !abilityName.empty()) {
775         AbilityInfo abilityInfo;
776         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
777         LOG_D(BMS_TAG_QUERY, "explicit query ret:%{public}d bundleName:%{public}s abilityName:%{public}s",
778             ret, bundleName.c_str(), abilityName.c_str());
779         if (ret) {
780             abilityInfos.emplace_back(abilityInfo);
781         }
782         // get cloneApp's abilityInfos
783         GetCloneAbilityInfos(abilityInfos, element, flags, userId);
784         if (abilityInfos.empty()) {
785             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d",
786                 bundleName.c_str(), abilityName.c_str(), userId);
787         }
788         return !abilityInfos.empty();
789     }
790     // implicit query
791     (void)ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
792     ImplicitQueryCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
793     if (abilityInfos.size() == 0) {
794         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
795             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
796             requestUserId);
797         return false;
798     }
799     return true;
800 }
801 
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const802 ErrCode BundleDataMgr::QueryAbilityInfosV9(
803     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
804 {
805     int32_t requestUserId = GetUserId(userId);
806     if (requestUserId == Constants::INVALID_USERID) {
807         APP_LOGE("request user id is invalid");
808         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
809     }
810 
811     ElementName element = want.GetElement();
812     std::string bundleName = element.GetBundleName();
813     std::string abilityName = element.GetAbilityName();
814     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfosV9 bundleName:%{public}s abilityName:%{public}s",
815         bundleName.c_str(), abilityName.c_str());
816     // explicit query
817     if (!bundleName.empty() && !abilityName.empty()) {
818         AbilityInfo abilityInfo;
819         ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
820         LOG_D(BMS_TAG_QUERY, "explicit queryV9 ret:%{public}d, bundleName:%{public}s abilityName:%{public}s",
821             ret, bundleName.c_str(), abilityName.c_str());
822         if (ret == ERR_OK) {
823             abilityInfos.emplace_back(abilityInfo);
824         }
825         // get cloneApp's abilityInfos
826         GetCloneAbilityInfosV9(abilityInfos, element, flags, userId);
827         if (abilityInfos.empty()) {
828             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility V9 error -n %{public}s -a %{public}s -u %{public}d",
829                 bundleName.c_str(), abilityName.c_str(), userId);
830             return ret;
831         }
832         return ERR_OK;
833     }
834     // implicit query
835     ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
836     ImplicitQueryCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
837     if (abilityInfos.empty()) {
838         if (ret != ERR_OK) {
839             return ret;
840         }
841         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
842             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
843             requestUserId);
844         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
845     }
846     return ERR_OK;
847 }
848 
BatchQueryAbilityInfos(const std::vector<Want> & wants,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const849 ErrCode BundleDataMgr::BatchQueryAbilityInfos(
850     const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
851 {
852     int32_t requestUserId = GetUserId(userId);
853     if (requestUserId == Constants::INVALID_USERID) {
854         APP_LOGE("request user id is invalid");
855         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
856     }
857 
858     for (size_t i = 0; i < wants.size(); i++) {
859         std::vector<AbilityInfo> tmpAbilityInfos;
860         ElementName element = wants[i].GetElement();
861         std::string bundleName = element.GetBundleName();
862         std::string abilityName = element.GetAbilityName();
863         APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
864             bundleName.c_str(), abilityName.c_str());
865         // explicit query
866         if (!bundleName.empty() && !abilityName.empty()) {
867             AbilityInfo abilityInfo;
868             ErrCode ret = ExplicitQueryAbilityInfoV9(wants[i], flags, requestUserId, abilityInfo);
869             if (ret != ERR_OK) {
870                 APP_LOGE("explicit queryAbilityInfoV9 error:%{public}d, bundleName:%{public}s, abilityName:%{public}s",
871                     ret, bundleName.c_str(), abilityName.c_str());
872                 return ret;
873             }
874             tmpAbilityInfos.emplace_back(abilityInfo);
875         } else {
876             // implicit query
877             ErrCode ret = ImplicitQueryAbilityInfosV9(wants[i], flags, requestUserId, tmpAbilityInfos);
878             if (ret != ERR_OK) {
879                 APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
880                     wants[i].GetAction().c_str(), wants[i].GetUriString().c_str(), wants[i].GetType().c_str());
881                 return ret;
882             }
883         }
884         for (size_t j = 0; j < tmpAbilityInfos.size(); j++) {
885             auto it = std::find_if(abilityInfos.begin(), abilityInfos.end(),
886                 [&](const AbilityInfo& info) {
887                     return tmpAbilityInfos[j].bundleName == info.bundleName &&
888                         tmpAbilityInfos[j].moduleName == info.moduleName &&
889                         tmpAbilityInfos[j].name == info.name;
890                 });
891             if (it == abilityInfos.end()) {
892                 abilityInfos.push_back(tmpAbilityInfos[j]);
893             }
894         }
895     }
896 
897     if (abilityInfos.empty()) {
898         APP_LOGW("no matching abilityInfo");
899         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
900     }
901 
902     return ERR_OK;
903 }
904 
ExplicitQueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const905 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
906     AbilityInfo &abilityInfo, int32_t appIndex) const
907 {
908     ElementName element = want.GetElement();
909     std::string bundleName = element.GetBundleName();
910     std::string abilityName = element.GetAbilityName();
911     std::string moduleName = element.GetModuleName();
912     LOG_D(BMS_TAG_QUERY,
913         "ExplicitQueryAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
914         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
915     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
916 
917     int32_t requestUserId = GetUserId(userId);
918     if (requestUserId == Constants::INVALID_USERID) {
919         APP_LOGE("request user id is invalid");
920         return false;
921     }
922 
923     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
924     InnerBundleInfo innerBundleInfo;
925     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
926         LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
927         return false;
928     }
929     // explict query from sandbox manager
930     if (appIndex > 0) {
931         if (sandboxAppHelper_ == nullptr) {
932             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
933             return false;
934         }
935         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
936         if (ret != ERR_OK) {
937             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
938                 ret, bundleName.c_str());
939             return false;
940         }
941     }
942 
943     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
944     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
945     if (!ability) {
946         LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility not found -n %{public}s -m %{public}s -a %{public}s",
947             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
948         return false;
949     }
950     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
951 }
952 
ExplicitQueryAbilityInfoV9(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const953 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
954     AbilityInfo &abilityInfo, int32_t appIndex) const
955 {
956     ElementName element = want.GetElement();
957     std::string bundleName = element.GetBundleName();
958     std::string abilityName = element.GetAbilityName();
959     std::string moduleName = element.GetModuleName();
960     LOG_D(BMS_TAG_QUERY,
961         "ExplicitQueryAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
962         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
963     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
964     int32_t requestUserId = GetUserId(userId);
965     if (requestUserId == Constants::INVALID_USERID) {
966         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
967     }
968     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
969     InnerBundleInfo innerBundleInfo;
970     if (appIndex == 0) {
971         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
972         if (ret != ERR_OK) {
973             LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
974             return ret;
975         }
976     }
977     // explict query from sandbox manager
978     if (appIndex > 0) {
979         if (sandboxAppHelper_ == nullptr) {
980             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
981             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
982         }
983         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
984         if (ret != ERR_OK) {
985             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
986                 ret, bundleName.c_str());
987             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
988         }
989     }
990 
991     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
992     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
993     if (!ability) {
994         LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 not found -n %{public}s -m %{public}s -a %{public}s",
995             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
996         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
997     }
998 
999     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1000 }
1001 
FilterAbilityInfosByModuleName(const std::string & moduleName,std::vector<AbilityInfo> & abilityInfos) const1002 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
1003     std::vector<AbilityInfo> &abilityInfos) const
1004 {
1005     LOG_D(BMS_TAG_QUERY, "FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
1006     if (moduleName.empty()) {
1007         return;
1008     }
1009     for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
1010         if (iter->moduleName != moduleName) {
1011             iter = abilityInfos.erase(iter);
1012         } else {
1013             ++iter;
1014         }
1015     }
1016 }
1017 
ImplicitQueryCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1018 void BundleDataMgr::ImplicitQueryCloneAbilityInfos(
1019     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1020 {
1021     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfos");
1022     int32_t requestUserId = GetUserId(userId);
1023     if (requestUserId == Constants::INVALID_USERID) {
1024         return;
1025     }
1026 
1027     if (want.GetAction().empty() && want.GetEntities().empty()
1028         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1029         LOG_E(BMS_TAG_QUERY, "param invalid");
1030         return;
1031     }
1032     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1033         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1034     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1035     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1036     if (bundleInfos_.empty()) {
1037         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1038         return;
1039     }
1040     std::string bundleName = want.GetElement().GetBundleName();
1041     if (!bundleName.empty()) {
1042         // query in current bundleName
1043         if (!ImplicitQueryCurCloneAbilityInfos(want, flags, requestUserId, abilityInfos)) {
1044             return;
1045         }
1046     } else {
1047         // query all
1048         ImplicitQueryAllCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
1049     }
1050     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1051     // sort by priority, descending order.
1052     if (abilityInfos.size() > 1) {
1053         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1054             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1055     }
1056     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfos");
1057 }
1058 
ImplicitQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1059 bool BundleDataMgr::ImplicitQueryAbilityInfos(
1060     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1061 {
1062     int32_t requestUserId = GetUserId(userId);
1063     if (requestUserId == Constants::INVALID_USERID) {
1064         return false;
1065     }
1066 
1067     if (want.GetAction().empty() && want.GetEntities().empty()
1068         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1069         LOG_E(BMS_TAG_QUERY, "param invalid");
1070         return false;
1071     }
1072     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1073         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1074     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1075     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1076     if (bundleInfos_.empty()) {
1077         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1078         return false;
1079     }
1080     std::string bundleName = want.GetElement().GetBundleName();
1081     if (!bundleName.empty()) {
1082         // query in current bundleName
1083         if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
1084             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s",
1085                 bundleName.c_str());
1086             return false;
1087         }
1088     } else {
1089         // query all
1090         ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
1091     }
1092     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1093     // sort by priority, descending order.
1094     if (abilityInfos.size() > 1) {
1095         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1096             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1097     }
1098     return true;
1099 }
1100 
ImplicitQueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1101 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
1102     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1103 {
1104     int32_t requestUserId = GetUserId(userId);
1105     if (requestUserId == Constants::INVALID_USERID) {
1106         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1107     }
1108 
1109     if (want.GetAction().empty() && want.GetEntities().empty()
1110         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1111         LOG_E(BMS_TAG_QUERY, "param invalid");
1112         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1113     }
1114     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1115         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1116     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1117     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1118     if (bundleInfos_.empty()) {
1119         APP_LOGW("bundleInfos_ is empty");
1120         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1121     }
1122     std::string bundleName = want.GetElement().GetBundleName();
1123     if (!bundleName.empty()) {
1124         // query in current bundleName
1125         ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1126         if (ret != ERR_OK) {
1127             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed bundleName:%{public}s",
1128                 bundleName.c_str());
1129             return ret;
1130         }
1131     } else {
1132         // query all
1133         ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1134     }
1135     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1136     // sort by priority, descending order.
1137     if (abilityInfos.size() > 1) {
1138         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1139             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1140     }
1141     return ERR_OK;
1142 }
1143 
ImplicitQueryCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1144 void BundleDataMgr::ImplicitQueryCloneAbilityInfosV9(
1145     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1146 {
1147     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfosV9");
1148     int32_t requestUserId = GetUserId(userId);
1149     if (requestUserId == Constants::INVALID_USERID) {
1150         return;
1151     }
1152     if (want.GetAction().empty() && want.GetEntities().empty()
1153         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1154         LOG_E(BMS_TAG_QUERY, "param invalid");
1155         return;
1156     }
1157     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1158         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1159     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1160 
1161     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1162     if (bundleInfos_.empty()) {
1163         APP_LOGW("bundleInfos_ is empty");
1164         return;
1165     }
1166     std::string bundleName = want.GetElement().GetBundleName();
1167     if (!bundleName.empty()) {
1168         // query in current bundleName
1169         if (!ImplicitQueryCurCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos)) {
1170             return;
1171         }
1172     } else {
1173         // query all
1174         ImplicitQueryAllCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
1175     }
1176     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1177     // sort by priority, descending order.
1178     if (abilityInfos.size() > 1) {
1179         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1180             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1181     }
1182     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfosV9");
1183 }
1184 
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1185 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
1186     const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const
1187 {
1188     LOG_D(BMS_TAG_QUERY,
1189         "begin to QueryAbilityInfoWithFlags flags=%{public}d,userId=%{public}d,appIndex=%{public}d",
1190         flags, userId, appIndex);
1191     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1192         !innerBundleInfo.IsSystemApp()) {
1193         LOG_W(BMS_TAG_QUERY, "no system app ability info for this calling");
1194         return false;
1195     }
1196     if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1197         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1198             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1199                 option->bundleName.c_str(), option->name.c_str());
1200             return false;
1201         }
1202     }
1203     info = (*option);
1204     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
1205         info.permissions.clear();
1206     }
1207     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1208         info.metaData.customizeData.clear();
1209         info.metadata.clear();
1210     }
1211     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
1212         info.skills.clear();
1213     }
1214     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
1215         innerBundleInfo.GetApplicationInfo(
1216             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
1217     }
1218     // set uid for NAPI cache use
1219     InnerBundleUserInfo innerBundleUserInfo;
1220     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1221         if (appIndex == 0) {
1222             info.uid = innerBundleUserInfo.uid;
1223         } else {
1224             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1225             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1226                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1227                 info.uid = cloneInfo.uid;
1228                 info.appIndex = cloneInfo.appIndex;
1229             } else {
1230                 LOG_W(BMS_TAG_QUERY, "can't find cloneInfos");
1231                 return false;
1232             }
1233         }
1234     }
1235     return true;
1236 }
1237 
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1238 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
1239     int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info,
1240     int32_t appIndex) const
1241 {
1242     LOG_D(BMS_TAG_QUERY, "begin to QueryAbilityInfoWithFlagsV9");
1243     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1244         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
1245         !innerBundleInfo.IsSystemApp()) {
1246         LOG_W(BMS_TAG_QUERY, "target not system app");
1247         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1248     }
1249     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1250         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1251             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1252                 option->bundleName.c_str(), option->name.c_str());
1253             return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1254         }
1255     }
1256     info = (*option);
1257     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1258         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1259         info.permissions.clear();
1260     }
1261     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1262         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1263         info.metaData.customizeData.clear();
1264         info.metadata.clear();
1265     }
1266     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1267         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1268         info.skills.clear();
1269     }
1270     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1271         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1272         innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1273             userId, info.applicationInfo, appIndex);
1274     }
1275     // set uid for NAPI cache use
1276     InnerBundleUserInfo innerBundleUserInfo;
1277     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1278         if (appIndex == 0) {
1279             info.uid = innerBundleUserInfo.uid;
1280         } else {
1281             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1282             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1283                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1284                 info.uid = cloneInfo.uid;
1285                 info.appIndex = cloneInfo.appIndex;
1286             } else {
1287                 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1288             }
1289         }
1290     }
1291     return ERR_OK;
1292 }
1293 
ImplicitQueryCurAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1294 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1295     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1296 {
1297     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfos");
1298     std::string bundleName = want.GetElement().GetBundleName();
1299     InnerBundleInfo innerBundleInfo;
1300     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
1301         LOG_W(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s", bundleName.c_str());
1302         return false;
1303     }
1304     if (appIndex > 0) {
1305         if (sandboxAppHelper_ == nullptr) {
1306             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1307             return false;
1308         }
1309         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1310         if (ret != ERR_OK) {
1311             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode:%{public}d bundleName:%{public}s",
1312                 ret, bundleName.c_str());
1313             return false;
1314         }
1315     }
1316     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1317     std::vector<std::string> mimeTypes;
1318     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1319     GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1320     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1321     return true;
1322 }
1323 
ImplicitQueryCurCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1324 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1325     std::vector<AbilityInfo> &abilityInfos) const
1326 {
1327     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfos");
1328     std::string bundleName = want.GetElement().GetBundleName();
1329     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1330     if (cloneAppIndexes.empty()) {
1331         return false;
1332     }
1333     std::vector<std::string> mimeTypes;
1334     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1335     for (int32_t appIndex: cloneAppIndexes) {
1336         InnerBundleInfo innerBundleInfo;
1337         if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex)) {
1338             continue;
1339         }
1340         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1341 
1342         GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1343         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1344     }
1345     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfos");
1346     return true;
1347 }
1348 
ImplicitQueryCurAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1349 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1350     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1351 {
1352     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfosV9");
1353     std::string bundleName = want.GetElement().GetBundleName();
1354     InnerBundleInfo innerBundleInfo;
1355     if (appIndex == 0) {
1356         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1357         if (ret != ERR_OK) {
1358             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s",
1359                 bundleName.c_str());
1360             return ret;
1361         }
1362     }
1363     if (appIndex > 0) {
1364         if (sandboxAppHelper_ == nullptr) {
1365             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1366             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1367         }
1368         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1369         if (ret != ERR_OK) {
1370             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d bundleName:%{public}s",
1371                 ret, bundleName.c_str());
1372             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1373         }
1374     }
1375     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1376     std::vector<std::string> mimeTypes;
1377     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1378     GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1379     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1380     return ERR_OK;
1381 }
1382 
ImplicitQueryCurCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1383 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1384     std::vector<AbilityInfo> &abilityInfos) const
1385 {
1386     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfosV9");
1387     std::string bundleName = want.GetElement().GetBundleName();
1388 
1389     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1390     if (cloneAppIndexes.empty()) {
1391         return false;
1392     }
1393     std::vector<std::string> mimeTypes;
1394     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1395     for (int32_t appIndex: cloneAppIndexes) {
1396         InnerBundleInfo innerBundleInfo;
1397         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
1398         if (ret != ERR_OK) {
1399             LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1400                 bundleName.c_str(), appIndex);
1401             continue;
1402         }
1403         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1404         GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1405         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1406     }
1407     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfosV9");
1408     return true;
1409 }
1410 
ImplicitQueryAllAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1411 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1412     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1413 {
1414     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfos");
1415     int32_t requestUserId = GetUserId(userId);
1416     if (requestUserId == Constants::INVALID_USERID) {
1417         LOG_W(BMS_TAG_QUERY, "invalid userId");
1418         return;
1419     }
1420     std::vector<std::string> mimeTypes;
1421     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1422     // query from bundleInfos_
1423     if (appIndex == 0) {
1424         for (const auto &item : bundleInfos_) {
1425             const InnerBundleInfo &innerBundleInfo = item.second;
1426             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1427             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1428                 LOG_D(BMS_TAG_QUERY,
1429                     "ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1430                     innerBundleInfo.GetBundleName().c_str(), responseUserId);
1431                 continue;
1432             }
1433             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1434         }
1435     } else {
1436         // query from sandbox manager for sandbox bundle
1437         if (sandboxAppHelper_ == nullptr) {
1438             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1439             return;
1440         }
1441         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1442         for (const auto &item : sandboxMap) {
1443             InnerBundleInfo info;
1444             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1445             if (pos == std::string::npos) {
1446                 LOG_D(BMS_TAG_QUERY, "sandbox map contains invalid element");
1447                 continue;
1448             }
1449             std::string innerBundleName = item.first.substr(pos + 1);
1450             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1451                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1452                 continue;
1453             }
1454             int32_t responseUserId = info.GetResponseUserId(userId);
1455             GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1456         }
1457     }
1458     APP_LOGD("finish to ImplicitQueryAllAbilityInfos");
1459 }
1460 
ImplicitQueryAllCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1461 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1462     std::vector<AbilityInfo> &abilityInfos) const
1463 {
1464     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfos");
1465     int32_t requestUserId = GetUserId(userId);
1466     if (requestUserId == Constants::INVALID_USERID) {
1467         LOG_W(BMS_TAG_QUERY, "invalid userId");
1468         return;
1469     }
1470     std::vector<std::string> mimeTypes;
1471     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1472     for (const auto &item : bundleInfos_) {
1473         const InnerBundleInfo &innerBundleInfo = item.second;
1474         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
1475         if (cloneAppIndexes.empty()) {
1476             continue;
1477         }
1478         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1479         for (int32_t appIndex: cloneAppIndexes) {
1480             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
1481                 LOG_D(BMS_TAG_QUERY,
1482                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
1483                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
1484                 continue;
1485             }
1486             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1487         }
1488     }
1489     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfos");
1490 }
1491 
ImplicitQueryAllAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1492 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1493     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1494 {
1495     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfosV9");
1496     // query from bundleInfos_
1497     std::vector<std::string> mimeTypes;
1498     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1499     if (appIndex == 0) {
1500         for (const auto &item : bundleInfos_) {
1501             InnerBundleInfo innerBundleInfo;
1502             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
1503             if (ret != ERR_OK) {
1504                 LOG_NOFUNC_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed -n %{public}s", item.first.c_str());
1505                 continue;
1506             }
1507 
1508             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1509             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1510         }
1511     } else {
1512         // query from sandbox manager for sandbox bundle
1513         if (sandboxAppHelper_ == nullptr) {
1514             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1515             return;
1516         }
1517         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1518         for (const auto &item : sandboxMap) {
1519             InnerBundleInfo info;
1520             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1521             if (pos == std::string::npos) {
1522                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
1523                 continue;
1524             }
1525             std::string innerBundleName = item.first.substr(pos + 1);
1526             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1527                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1528                 continue;
1529             }
1530 
1531             int32_t responseUserId = info.GetResponseUserId(userId);
1532             GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1533         }
1534     }
1535     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllAbilityInfosV9");
1536 }
1537 
ImplicitQueryAllCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1538 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1539     std::vector<AbilityInfo> &abilityInfos) const
1540 {
1541     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfosV9");
1542     std::vector<std::string> mimeTypes;
1543     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1544     for (const auto &item : bundleInfos_) {
1545         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(item.second.GetBundleName(), userId);
1546         if (cloneAppIndexes.empty()) {
1547             continue;
1548         }
1549         for (int32_t appIndex: cloneAppIndexes) {
1550             InnerBundleInfo innerBundleInfo;
1551             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId, appIndex);
1552             if (ret != ERR_OK) {
1553                 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1554                     item.first.c_str(), appIndex);
1555                 continue;
1556             }
1557 
1558             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1559             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1560         }
1561     }
1562     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfosV9");
1563 }
1564 
CheckAbilityInfoFlagExist(int32_t flags,AbilityInfoFlag abilityInfoFlag) const1565 bool BundleDataMgr::CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const
1566 {
1567     return (static_cast<uint32_t>(flags) & static_cast<uint32_t>(abilityInfoFlag)) == abilityInfoFlag;
1568 }
1569 
GetMatchAbilityInfos(const Want & want,int32_t flags,const InnerBundleInfo & info,int32_t userId,std::vector<AbilityInfo> & abilityInfos,const std::vector<std::string> & paramMimeTypes,int32_t appIndex) const1570 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags, const InnerBundleInfo &info,
1571     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1572     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1573 {
1574     if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_SYSTEMAPP_ONLY) && !info.IsSystemApp()) {
1575         return;
1576     }
1577     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1578     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1579         bool isPrivateType = MatchPrivateType(
1580             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1581         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1582         if (skillsPair == skillInfos.end()) {
1583             continue;
1584         }
1585         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1586             const Skill &skill = skillsPair->second[skillIndex];
1587             size_t matchUriIndex = 0;
1588             if (isPrivateType || skill.Match(want, matchUriIndex)) {
1589                 AbilityInfo abilityinfo = abilityInfoPair.second;
1590                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1591                     continue;
1592                 }
1593                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_DISABLE) &&
1594                     !info.IsAbilityEnabled(abilityinfo, GetUserId(userId), appIndex)) {
1595                     LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityinfo.name.c_str());
1596                     continue;
1597                 }
1598                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_APPLICATION)) {
1599                     info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1600                         userId, abilityinfo.applicationInfo, appIndex);
1601                 }
1602                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_PERMISSION)) {
1603                     abilityinfo.permissions.clear();
1604                 }
1605                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_METADATA)) {
1606                     abilityinfo.metaData.customizeData.clear();
1607                     abilityinfo.metadata.clear();
1608                 }
1609                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL)) {
1610                     abilityinfo.skills.clear();
1611                 }
1612                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL_URI)) {
1613                     AddSkillUrisInfo(skillsPair->second, abilityinfo.skillUri, skillIndex, matchUriIndex);
1614                 }
1615                 abilityinfo.appIndex = appIndex;
1616                 abilityInfos.emplace_back(abilityinfo);
1617                 break;
1618             }
1619         }
1620     }
1621 }
1622 
AddSkillUrisInfo(const std::vector<Skill> & skills,std::vector<SkillUriForAbilityAndExtension> & skillUris,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex) const1623 void BundleDataMgr::AddSkillUrisInfo(const std::vector<Skill> &skills,
1624     std::vector<SkillUriForAbilityAndExtension> &skillUris,
1625     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const
1626 {
1627     for (size_t skillIndex = 0; skillIndex < skills.size(); ++skillIndex) {
1628         const Skill &skill = skills[skillIndex];
1629         for (size_t uriIndex = 0; uriIndex < skill.uris.size(); ++uriIndex) {
1630             const SkillUri &uri = skill.uris[uriIndex];
1631             SkillUriForAbilityAndExtension skillinfo;
1632             skillinfo.scheme = uri.scheme;
1633             skillinfo.host = uri.host;
1634             skillinfo.port = uri.port;
1635             skillinfo.path = uri.path;
1636             skillinfo.pathStartWith = uri.pathStartWith;
1637             skillinfo.pathRegex = uri.pathRegex;
1638             skillinfo.type = uri.type;
1639             skillinfo.utd = uri.utd;
1640             skillinfo.maxFileSupported = uri.maxFileSupported;
1641             skillinfo.linkFeature = uri.linkFeature;
1642             if (matchSkillIndex.has_value() && matchUriIndex.has_value() &&
1643                 skillIndex == matchSkillIndex.value() && uriIndex == matchUriIndex.value()) {
1644                 skillinfo.isMatch = true;
1645             }
1646             skillUris.emplace_back(skillinfo);
1647         }
1648     }
1649 }
1650 
EmplaceAbilityInfo(const InnerBundleInfo & info,const std::vector<Skill> & skills,AbilityInfo & abilityInfo,int32_t flags,int32_t userId,std::vector<AbilityInfo> & infos,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex,int32_t appIndex) const1651 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
1652     AbilityInfo &abilityInfo, int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos,
1653     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
1654 {
1655     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1656         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1657         if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId), appIndex)) {
1658             LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityInfo.name.c_str());
1659             return;
1660         }
1661     }
1662     if ((static_cast<uint32_t>(flags) &
1663         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1664         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1665         info.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1666             userId, abilityInfo.applicationInfo, appIndex);
1667     }
1668     if ((static_cast<uint32_t>(flags) &
1669         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1670         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1671         abilityInfo.permissions.clear();
1672     }
1673     if ((static_cast<uint32_t>(flags) &
1674         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1675         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1676         abilityInfo.metaData.customizeData.clear();
1677         abilityInfo.metadata.clear();
1678     }
1679     if ((static_cast<uint32_t>(flags) &
1680         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1681         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1682         abilityInfo.skills.clear();
1683     }
1684     if ((static_cast<uint32_t>(flags) &
1685         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) ==
1686         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) {
1687         AddSkillUrisInfo(skills, abilityInfo.skillUri, matchSkillIndex, matchUriIndex);
1688     }
1689     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
1690         // set uid for NAPI cache use
1691         InnerBundleUserInfo innerBundleUserInfo;
1692         if (info.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1693             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1694             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1695                 abilityInfo.uid = innerBundleUserInfo.cloneInfos.at(appIndexKey).uid;
1696                 abilityInfo.appIndex = innerBundleUserInfo.cloneInfos.at(appIndexKey).appIndex;
1697             }
1698         }
1699     }
1700     infos.emplace_back(abilityInfo);
1701 }
1702 
GetMatchAbilityInfosV9(const Want & want,int32_t flags,const InnerBundleInfo & info,int32_t userId,std::vector<AbilityInfo> & abilityInfos,const std::vector<std::string> & paramMimeTypes,int32_t appIndex) const1703 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags, const InnerBundleInfo &info,
1704     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1705     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1706 {
1707     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1708         static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1709         LOG_W(BMS_TAG_QUERY, "target not system app");
1710         return;
1711     }
1712     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1713     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1714         AbilityInfo abilityinfo = abilityInfoPair.second;
1715         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1716         if (skillsPair == skillInfos.end()) {
1717             continue;
1718         }
1719         bool isPrivateType = MatchPrivateType(
1720             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1721         if (isPrivateType) {
1722             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1723                 std::nullopt, std::nullopt, appIndex);
1724             continue;
1725         }
1726         if (want.GetAction() == SHARE_ACTION) {
1727             if (!MatchShare(want, skillsPair->second)) {
1728                 continue;
1729             }
1730             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1731                 std::nullopt, std::nullopt, appIndex);
1732             continue;
1733         }
1734         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1735             const Skill &skill = skillsPair->second[skillIndex];
1736             size_t matchUriIndex = 0;
1737             if (skill.Match(want, matchUriIndex)) {
1738                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1739                     continue;
1740                 }
1741                 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1742                     skillIndex, matchUriIndex, appIndex);
1743                 break;
1744             }
1745         }
1746     }
1747 }
1748 
MatchShare(const Want & want,const std::vector<Skill> & skills) const1749 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1750 {
1751     if (want.GetAction() != SHARE_ACTION) {
1752         LOG_E(BMS_TAG_QUERY, "action not action");
1753         return false;
1754     }
1755     std::vector<Skill> shareActionSkills = FindSkillsContainShareAction(skills);
1756     if (shareActionSkills.empty()) {
1757         LOG_NOFUNC_E(BMS_TAG_QUERY, "shareActionSkills is empty");
1758         return false;
1759     }
1760     auto wantParams = want.GetParams();
1761     auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1762     int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1763     if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1764         LOG_W(BMS_TAG_QUERY, "Invalid total count");
1765     }
1766     auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1767     auto utds = shareSummary.KeySet();
1768     for (auto &skill : shareActionSkills) {
1769         bool match = true;
1770         for (const auto &utd : utds) {
1771             int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1772             if (!MatchUtd(skill, utd, count)) {
1773                 match = false;
1774                 break;
1775             }
1776         }
1777         if (match) {
1778             return true;
1779         }
1780     }
1781     return false;
1782 }
1783 
MatchUtd(Skill & skill,const std::string & utd,int32_t count) const1784 bool BundleDataMgr::MatchUtd(Skill &skill, const std::string &utd, int32_t count) const
1785 {
1786     if (skill.uris.empty() || count <= DEFAULT_SUMMARY_COUNT) {
1787         LOG_W(BMS_TAG_QUERY, "skill.uris is empty or invalid utd count");
1788         return false;
1789     }
1790     bool isMatch = false;
1791     for (SkillUri &skillUri : skill.uris) {
1792         if (!skillUri.utd.empty()) {
1793             if (MatchUtd(skillUri.utd, utd)) {
1794                 skillUri.maxFileSupported -= count;
1795                 isMatch = true;
1796                 if (skillUri.maxFileSupported < 0) {
1797                     return false;
1798                 }
1799             }
1800         } else {
1801             if (MatchTypeWithUtd(skillUri.type, utd)) {
1802                 skillUri.maxFileSupported -= count;
1803                 isMatch = true;
1804                 if (skillUri.maxFileSupported < 0) {
1805                     return false;
1806                 }
1807             }
1808         }
1809     }
1810     return isMatch;
1811 }
1812 
MatchUtd(const std::string & skillUtd,const std::string & wantUtd) const1813 bool BundleDataMgr::MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const
1814 {
1815 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1816     LOG_W(BMS_TAG_QUERY, "skillUtd %{public}s, wantUtd %{public}s", skillUtd.c_str(), wantUtd.c_str());
1817     std::shared_ptr<UDMF::TypeDescriptor> wantTypeDescriptor;
1818     auto ret = UDMF::UtdClient::GetInstance().GetTypeDescriptor(wantUtd, wantTypeDescriptor);
1819     if (ret != ERR_OK || wantTypeDescriptor == nullptr) {
1820         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1821         return false;
1822     }
1823     bool matchRet = false;
1824     ret = wantTypeDescriptor->BelongsTo(skillUtd, matchRet);
1825     if (ret != ERR_OK) {
1826         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1827         return false;
1828     }
1829     return matchRet;
1830 #endif
1831     return false;
1832 }
1833 
MatchTypeWithUtd(const std::string & mimeType,const std::string & wantUtd) const1834 bool BundleDataMgr::MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const
1835 {
1836 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1837     LOG_W(BMS_TAG_QUERY, "mimeType %{public}s, wantUtd %{public}s", mimeType.c_str(), wantUtd.c_str());
1838     std::vector<std::string> typeUtdVector = BundleUtil::GetUtdVectorByMimeType(mimeType);
1839     for (const std::string &typeUtd : typeUtdVector) {
1840         if (MatchUtd(typeUtd, wantUtd)) {
1841             return true;
1842         }
1843     }
1844     return false;
1845 #endif
1846     return false;
1847 }
1848 
FindSkillsContainShareAction(const std::vector<Skill> & skills) const1849 std::vector<Skill> BundleDataMgr::FindSkillsContainShareAction(const std::vector<Skill> &skills) const
1850 {
1851     std::vector<Skill> shareActionSkills;
1852     for (const auto &skill : skills) {
1853         auto &actions = skill.actions;
1854         auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1855             return SHARE_ACTION == action;
1856         });
1857         if (matchAction == actions.end()) {
1858             continue;
1859         }
1860         shareActionSkills.emplace_back(skill);
1861     }
1862     return shareActionSkills;
1863 }
1864 
ModifyLauncherAbilityInfo(bool isStage,AbilityInfo & abilityInfo) const1865 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1866 {
1867     if (abilityInfo.labelId == 0) {
1868         if (isStage) {
1869             abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1870             abilityInfo.label = abilityInfo.applicationInfo.label;
1871         } else {
1872             abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1873             abilityInfo.label = abilityInfo.bundleName;
1874         }
1875     }
1876 
1877     if (abilityInfo.iconId == 0) {
1878         abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1879     }
1880 }
1881 
GetMatchLauncherAbilityInfos(const Want & want,const InnerBundleInfo & info,std::vector<AbilityInfo> & abilityInfos,int64_t installTime,int32_t userId) const1882 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1883     const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1884     int64_t installTime, int32_t userId) const
1885 {
1886     int32_t requestUserId = GetUserId(userId);
1887     if (requestUserId == Constants::INVALID_USERID) {
1888         APP_LOGD("request user id is invalid");
1889         return;
1890     }
1891     int32_t responseUserId = info.GetResponseUserId(requestUserId);
1892     if (responseUserId == Constants::INVALID_USERID) {
1893         APP_LOGD("response user id is invalid");
1894         return;
1895     }
1896     // get clone bundle info
1897     InnerBundleUserInfo bundleUserInfo;
1898     (void)info.GetInnerBundleUserInfo(responseUserId, bundleUserInfo);
1899     if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(info.GetBundleName()) !=
1900         ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) {
1901         GetMultiLauncherAbilityInfo(want, info, bundleUserInfo, installTime, abilityInfos);
1902         return;
1903     }
1904     AbilityInfo mainAbilityInfo;
1905     info.GetMainAbilityInfo(mainAbilityInfo);
1906     if (!mainAbilityInfo.name.empty() && (mainAbilityInfo.type == AbilityType::PAGE)) {
1907         APP_LOGD("bundleName %{public}s exist mainAbility", info.GetBundleName().c_str());
1908         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1909             responseUserId, mainAbilityInfo.applicationInfo);
1910         if (mainAbilityInfo.applicationInfo.removable && info.IsNeedSendNotify()) {
1911             mainAbilityInfo.applicationInfo.removable = info.GetUninstallState();
1912         }
1913         mainAbilityInfo.installTime = installTime;
1914         // fix labelId or iconId is equal 0
1915         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), mainAbilityInfo);
1916         abilityInfos.emplace_back(mainAbilityInfo);
1917         GetMatchLauncherAbilityInfosForCloneInfos(info, mainAbilityInfo, bundleUserInfo,
1918             abilityInfos);
1919         return;
1920     }
1921     // add app detail ability
1922     if (info.GetBaseApplicationInfo().needAppDetail) {
1923         LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s add detail ability info", info.GetBundleName().c_str());
1924         std::string moduleName = "";
1925         auto ability = info.FindAbilityInfo(moduleName, ServiceConstants::APP_DETAIL_ABILITY, responseUserId);
1926         if (!ability) {
1927             LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s cant find ability", info.GetBundleName().c_str());
1928             return;
1929         }
1930         if (!info.GetIsNewVersion()) {
1931             ability->applicationInfo.label = info.GetBundleName();
1932         }
1933         ability->installTime = installTime;
1934         abilityInfos.emplace_back(*ability);
1935         GetMatchLauncherAbilityInfosForCloneInfos(info, *ability, bundleUserInfo, abilityInfos);
1936     }
1937 }
1938 
GetMultiLauncherAbilityInfo(const Want & want,const InnerBundleInfo & info,const InnerBundleUserInfo & bundleUserInfo,int64_t installTime,std::vector<AbilityInfo> & abilityInfos) const1939 void BundleDataMgr::GetMultiLauncherAbilityInfo(const Want& want,
1940     const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo,
1941     int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const
1942 {
1943     int32_t count = 0;
1944     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1945     for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
1946         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1947         if (skillsPair == skillInfos.end()) {
1948             continue;
1949         }
1950         for (const Skill& skill : skillsPair->second) {
1951             if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
1952                 count++;
1953                 AbilityInfo abilityInfo = abilityInfoPair.second;
1954                 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1955                     bundleUserInfo.bundleUserInfo.userId, abilityInfo.applicationInfo);
1956                 abilityInfo.installTime = installTime;
1957                 // fix labelId or iconId is equal 0
1958                 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), abilityInfo);
1959                 abilityInfos.emplace_back(abilityInfo);
1960                 GetMatchLauncherAbilityInfosForCloneInfos(info, abilityInfoPair.second, bundleUserInfo, abilityInfos);
1961                 break;
1962             }
1963         }
1964     }
1965     APP_LOGI("bundleName %{public}s has %{public}d launcher ability", info.GetBundleName().c_str(), count);
1966 }
1967 
GetMatchLauncherAbilityInfosForCloneInfos(const InnerBundleInfo & info,const AbilityInfo & abilityInfo,const InnerBundleUserInfo & bundleUserInfo,std::vector<AbilityInfo> & abilityInfos) const1968 void BundleDataMgr::GetMatchLauncherAbilityInfosForCloneInfos(
1969     const InnerBundleInfo& info,
1970     const AbilityInfo &abilityInfo,
1971     const InnerBundleUserInfo &bundleUserInfo,
1972     std::vector<AbilityInfo>& abilityInfos) const
1973 {
1974     for (const auto &item : bundleUserInfo.cloneInfos) {
1975         APP_LOGD("bundleName:%{public}s appIndex:%{public}d start", info.GetBundleName().c_str(), item.second.appIndex);
1976         AbilityInfo cloneAbilityInfo = abilityInfo;
1977         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1978             bundleUserInfo.bundleUserInfo.userId, cloneAbilityInfo.applicationInfo, item.second.appIndex);
1979         cloneAbilityInfo.installTime = item.second.installTime;
1980         cloneAbilityInfo.uid = item.second.uid;
1981         cloneAbilityInfo.appIndex = item.second.appIndex;
1982         // fix labelId or iconId is equal 0
1983         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), cloneAbilityInfo);
1984         abilityInfos.emplace_back(cloneAbilityInfo);
1985     }
1986 }
1987 
ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,ApplicationInfo & applicationInfo) const1988 void BundleDataMgr::ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
1989     ApplicationInfo &applicationInfo) const
1990 {
1991     applicationInfo.accessTokenId = cloneInfo.accessTokenId;
1992     applicationInfo.accessTokenIdEx = cloneInfo.accessTokenIdEx;
1993     applicationInfo.enabled = cloneInfo.enabled;
1994     applicationInfo.uid = cloneInfo.uid;
1995     applicationInfo.appIndex = cloneInfo.appIndex;
1996 }
1997 
ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,BundleInfo & bundleInfo) const1998 void BundleDataMgr::ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
1999     BundleInfo &bundleInfo) const
2000 {
2001     bundleInfo.uid = cloneInfo.uid;
2002     bundleInfo.gid = cloneInfo.uid; // no gids, need add
2003     bundleInfo.installTime = cloneInfo.installTime;
2004     bundleInfo.appIndex = cloneInfo.appIndex;
2005     if (!bundleInfo.applicationInfo.bundleName.empty()) {
2006         ModifyApplicationInfoByCloneInfo(cloneInfo, bundleInfo.applicationInfo);
2007     }
2008 }
2009 
GetCloneBundleInfos(const InnerBundleInfo & info,int32_t flags,int32_t userId,BundleInfo & bundleInfo,std::vector<BundleInfo> & bundleInfos) const2010 void BundleDataMgr::GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId,
2011     BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const
2012 {
2013     // get clone bundle info
2014     InnerBundleUserInfo bundleUserInfo;
2015     (void)info.GetInnerBundleUserInfo(userId, bundleUserInfo);
2016     if (bundleUserInfo.cloneInfos.empty()) {
2017         return;
2018     }
2019     LOG_D(BMS_TAG_QUERY, "app %{public}s start get bundle clone info",
2020         info.GetBundleName().c_str());
2021     for (const auto &item : bundleUserInfo.cloneInfos) {
2022         BundleInfo cloneBundleInfo;
2023         ErrCode ret = info.GetBundleInfoV9(flags, cloneBundleInfo, userId, item.second.appIndex);
2024         if (ret == ERR_OK) {
2025             ProcessBundleMenu(cloneBundleInfo, flags, true);
2026             ProcessBundleRouterMap(cloneBundleInfo, flags);
2027             bundleInfos.emplace_back(cloneBundleInfo);
2028         }
2029     }
2030 }
2031 
GetBundleNameAndIndexByName(const std::string & keyName,std::string & bundleName,int32_t & appIndex) const2032 void BundleDataMgr::GetBundleNameAndIndexByName(
2033     const std::string &keyName, std::string &bundleName, int32_t &appIndex) const
2034 {
2035     bundleName = keyName;
2036     appIndex = 0;
2037     // for clone bundle name
2038     auto pos = keyName.find(CLONE_BUNDLE_PREFIX);
2039     if ((pos == std::string::npos) || (pos == 0)) {
2040         return;
2041     }
2042     std::string index = keyName.substr(0, pos);
2043     if (!OHOS::StrToInt(index, appIndex)) {
2044         appIndex = 0;
2045         return;
2046     }
2047     bundleName = keyName.substr(pos + strlen(CLONE_BUNDLE_PREFIX));
2048 }
2049 
GetCloneAppIndexes(const std::string & bundleName,int32_t userId) const2050 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const
2051 {
2052     std::vector<int32_t> cloneAppIndexes;
2053     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2054     if (userId == Constants::ANY_USERID) {
2055         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2056             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2057             return cloneAppIndexes;
2058         }
2059         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2060     }
2061     int32_t requestUserId = GetUserId(userId);
2062     if (requestUserId == Constants::INVALID_USERID) {
2063         return cloneAppIndexes;
2064     }
2065     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2066     auto infoItem = bundleInfos_.find(bundleName);
2067     if (infoItem == bundleInfos_.end()) {
2068         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2069         return cloneAppIndexes;
2070     }
2071     const InnerBundleInfo &bundleInfo = infoItem->second;
2072     InnerBundleUserInfo innerBundleUserInfo;
2073     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2074         return cloneAppIndexes;
2075     }
2076     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2077     if (cloneInfos.empty()) {
2078         return cloneAppIndexes;
2079     }
2080     for (const auto &cloneInfo : cloneInfos) {
2081         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes: %{public}d", cloneInfo.second.appIndex);
2082         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2083     }
2084     return cloneAppIndexes;
2085 }
2086 
GetCloneAppIndexesNoLock(const std::string & bundleName,int32_t userId) const2087 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const
2088 {
2089     std::vector<int32_t> cloneAppIndexes;
2090     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2091     if (userId == Constants::ANY_USERID) {
2092         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2093             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2094             return cloneAppIndexes;
2095         }
2096         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2097     }
2098     int32_t requestUserId = GetUserId(userId);
2099     if (requestUserId == Constants::INVALID_USERID) {
2100         return cloneAppIndexes;
2101     }
2102     auto infoItem = bundleInfos_.find(bundleName);
2103     if (infoItem == bundleInfos_.end()) {
2104         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2105         return cloneAppIndexes;
2106     }
2107     const InnerBundleInfo &bundleInfo = infoItem->second;
2108     InnerBundleUserInfo innerBundleUserInfo;
2109     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2110         return cloneAppIndexes;
2111     }
2112     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2113     if (cloneInfos.empty()) {
2114         return cloneAppIndexes;
2115     }
2116     for (const auto &cloneInfo : cloneInfos) {
2117         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes unLock: %{public}d", cloneInfo.second.appIndex);
2118         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2119     }
2120     return cloneAppIndexes;
2121 }
2122 
AddAppDetailAbilityInfo(InnerBundleInfo & info) const2123 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
2124 {
2125     AbilityInfo appDetailAbility;
2126     appDetailAbility.name = ServiceConstants::APP_DETAIL_ABILITY;
2127     appDetailAbility.bundleName = info.GetBundleName();
2128     appDetailAbility.enabled = true;
2129     appDetailAbility.type = AbilityType::PAGE;
2130     appDetailAbility.isNativeAbility = true;
2131 
2132     ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
2133     appDetailAbility.applicationName = applicationInfo.name;
2134     appDetailAbility.labelId = applicationInfo.labelResource.id;
2135     if (!info.GetIsNewVersion()) {
2136         appDetailAbility.labelId = 0;
2137         appDetailAbility.label = info.GetBundleName();
2138     }
2139     appDetailAbility.iconId = applicationInfo.iconResource.id;
2140     appDetailAbility.moduleName = applicationInfo.iconResource.moduleName;
2141 
2142     if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
2143         LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo appDetailAbility.iconId is 0");
2144         // get system resource icon Id
2145         auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
2146         if (iter != bundleInfos_.end()) {
2147             LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo get system resource iconId");
2148             appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
2149         } else {
2150             LOG_W(BMS_TAG_QUERY, "AddAppDetailAbilityInfo error: ohos.global.systemres does not exist");
2151         }
2152     }
2153     // not show in the mission list
2154     appDetailAbility.removeMissionAfterTerminate = true;
2155     // set hapPath, for label resource
2156     auto innerModuleInfo = info.GetInnerModuleInfoByModuleName(appDetailAbility.moduleName);
2157     if (innerModuleInfo) {
2158         appDetailAbility.package = innerModuleInfo->modulePackage;
2159         appDetailAbility.hapPath = innerModuleInfo->hapPath;
2160     }
2161     appDetailAbility.visible = true;
2162     std::string keyName;
2163     keyName.append(appDetailAbility.bundleName).append(".")
2164         .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
2165     info.InsertAbilitiesInfo(keyName, appDetailAbility);
2166 }
2167 
GetAllLauncherAbility(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2168 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2169     const int32_t userId, const int32_t requestUserId) const
2170 {
2171     for (const auto &item : bundleInfos_) {
2172         const InnerBundleInfo &info = item.second;
2173         if (info.IsDisabled()) {
2174             LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2175             continue;
2176         }
2177         if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2178             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
2179             continue;
2180         }
2181         if (info.GetBaseBundleInfo().entryInstallationFree) {
2182             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon",
2183                 info.GetBundleName().c_str());
2184             continue;
2185         }
2186 
2187         // get installTime from innerBundleUserInfo
2188         int64_t installTime = 0;
2189         std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2190         std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2191         auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2192             [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2193             return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2194         });
2195         if (iter != info.GetInnerBundleUserInfos().end()) {
2196             installTime = iter->second.installTime;
2197         }
2198         GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
2199     }
2200 }
2201 
GetLauncherAbilityByBundleName(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2202 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2203     const int32_t userId, const int32_t requestUserId) const
2204 {
2205     ElementName element = want.GetElement();
2206     std::string bundleName = element.GetBundleName();
2207     const auto &item = bundleInfos_.find(bundleName);
2208     if (item == bundleInfos_.end()) {
2209         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2210         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2211     }
2212     const InnerBundleInfo &info = item->second;
2213     if (info.IsDisabled()) {
2214         LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2215         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
2216     }
2217     if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2218         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2219         return ERR_OK;
2220     }
2221     if (info.GetBaseBundleInfo().entryInstallationFree) {
2222         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2223         return ERR_OK;
2224     }
2225     // get installTime from innerBundleUserInfo
2226     int64_t installTime = 0;
2227     std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2228     std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2229     auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2230         [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2231         return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2232     });
2233     if (iter != info.GetInnerBundleUserInfos().end()) {
2234         installTime = iter->second.installTime;
2235     }
2236     GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2237     FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2238     return ERR_OK;
2239 }
2240 
QueryLauncherAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2241 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
2242     const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
2243 {
2244     int32_t requestUserId = GetUserId(userId);
2245     if (requestUserId == Constants::INVALID_USERID) {
2246         LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2247         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2248     }
2249     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2250     if (bundleInfos_.empty()) {
2251         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
2252         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2253     }
2254 
2255     ElementName element = want.GetElement();
2256     std::string bundleName = element.GetBundleName();
2257     if (bundleName.empty()) {
2258         // query all launcher ability
2259         GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
2260         return ERR_OK;
2261     }
2262     // query definite abilities by bundle name
2263     ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
2264     if (ret == ERR_OK) {
2265         LOG_D(BMS_TAG_QUERY, "ability infos have been found");
2266     }
2267     return ret;
2268 }
2269 
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo) const2270 bool BundleDataMgr::QueryAbilityInfoByUri(
2271     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
2272 {
2273     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2274     int32_t requestUserId = GetUserId(userId);
2275     if (requestUserId == Constants::INVALID_USERID) {
2276         return false;
2277     }
2278 
2279     if (abilityUri.empty()) {
2280         return false;
2281     }
2282     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2283         return false;
2284     }
2285     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2286     if (bundleInfos_.empty()) {
2287         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2288         return false;
2289     }
2290     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2291     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2292     if (posFirstSeparator == std::string::npos) {
2293         return false;
2294     }
2295     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2296     std::string uri;
2297     if (posSecondSeparator == std::string::npos) {
2298         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2299     } else {
2300         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2301     }
2302     for (const auto &item : bundleInfos_) {
2303         const InnerBundleInfo &info = item.second;
2304         if (info.IsDisabled()) {
2305             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2306             continue;
2307         }
2308 
2309         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2310         if (!info.GetApplicationEnabled(responseUserId)) {
2311             continue;
2312         }
2313 
2314         auto ability = info.FindAbilityInfoByUri(uri);
2315         if (!ability) {
2316             continue;
2317         }
2318 
2319         abilityInfo = (*ability);
2320         info.GetApplicationInfo(
2321             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
2322             abilityInfo.applicationInfo);
2323         return true;
2324     }
2325 
2326     LOG_W(BMS_TAG_QUERY, "query abilityUri(%{private}s) failed", abilityUri.c_str());
2327     return false;
2328 }
2329 
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)2330 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
2331 {
2332     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2333     if (abilityUri.empty()) {
2334         return false;
2335     }
2336     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2337         return false;
2338     }
2339     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2340     if (bundleInfos_.empty()) {
2341         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2342         return false;
2343     }
2344     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2345     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2346     if (posFirstSeparator == std::string::npos) {
2347         return false;
2348     }
2349     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2350     std::string uri;
2351     if (posSecondSeparator == std::string::npos) {
2352         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2353     } else {
2354         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2355     }
2356 
2357     for (auto &item : bundleInfos_) {
2358         InnerBundleInfo &info = item.second;
2359         if (info.IsDisabled()) {
2360             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2361             continue;
2362         }
2363         info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
2364     }
2365     if (abilityInfos.size() == 0) {
2366         return false;
2367     }
2368 
2369     return true;
2370 }
2371 
GetApplicationInfo(const std::string & appName,int32_t flags,const int userId,ApplicationInfo & appInfo) const2372 bool BundleDataMgr::GetApplicationInfo(
2373     const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
2374 {
2375     int32_t requestUserId = GetUserId(userId);
2376     if (requestUserId == Constants::INVALID_USERID) {
2377         return false;
2378     }
2379 
2380     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2381     InnerBundleInfo innerBundleInfo;
2382     if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
2383         LOG_D(BMS_TAG_QUERY, "GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
2384         return false;
2385     }
2386 
2387     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2388     innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
2389     return true;
2390 }
2391 
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo,const int32_t appIndex) const2392 ErrCode BundleDataMgr::GetApplicationInfoV9(
2393     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const
2394 {
2395     int32_t requestUserId = GetUserId(userId);
2396     if (requestUserId == Constants::INVALID_USERID) {
2397         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2398     }
2399 
2400     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2401     InnerBundleInfo innerBundleInfo;
2402     int32_t flag = 0;
2403     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2404         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2405         flag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2406     }
2407     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId, appIndex);
2408     if (ret != ERR_OK) {
2409         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2410             appName.c_str(), requestUserId, appIndex);
2411         return ret;
2412     }
2413 
2414     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2415     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo, appIndex);
2416     if (ret != ERR_OK) {
2417         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2418             appName.c_str(), responseUserId, appIndex);
2419         return ret;
2420     }
2421     return ret;
2422 }
2423 
GetApplicationInfoWithResponseId(const std::string & appName,int32_t flags,int32_t & userId,ApplicationInfo & appInfo) const2424 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
2425     const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
2426 {
2427     int32_t requestUserId = GetUserId(userId);
2428     if (requestUserId == Constants::INVALID_USERID) {
2429         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2430     }
2431 
2432     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2433     InnerBundleInfo innerBundleInfo;
2434     int32_t flag = 0;
2435     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2436         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2437         flag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2438     }
2439     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
2440     if (ret != ERR_OK) {
2441         LOG_D(BMS_TAG_QUERY,
2442             "GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
2443             appName.c_str(), requestUserId);
2444         return ret;
2445     }
2446 
2447     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2448     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
2449     if (ret != ERR_OK) {
2450         LOG_D(BMS_TAG_QUERY,
2451             "GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
2452             appName.c_str(), responseUserId);
2453         return ret;
2454     }
2455     userId = responseUserId;
2456     return ret;
2457 }
2458 
GetCloneAppInfo(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2459 void BundleDataMgr::GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2460     std::vector<ApplicationInfo> &appInfos) const
2461 {
2462     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2463     for (int32_t appIndex : appIndexVec) {
2464         bool isEnabled = false;
2465         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2466         if (ret != ERR_OK) {
2467             continue;
2468         }
2469         if (isEnabled || (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2470             ApplicationInfo cloneAppInfo;
2471             info.GetApplicationInfo(flags, userId, cloneAppInfo, appIndex);
2472             if (cloneAppInfo.appIndex == appIndex) {
2473                 appInfos.emplace_back(cloneAppInfo);
2474             }
2475         }
2476     }
2477 }
2478 
GetApplicationInfos(int32_t flags,const int userId,std::vector<ApplicationInfo> & appInfos) const2479 bool BundleDataMgr::GetApplicationInfos(
2480     int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
2481 {
2482     int32_t requestUserId = GetUserId(userId);
2483     if (requestUserId == Constants::INVALID_USERID) {
2484         return false;
2485     }
2486 
2487     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2488     if (bundleInfos_.empty()) {
2489         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2490         return false;
2491     }
2492 
2493     for (const auto &item : bundleInfos_) {
2494         const InnerBundleInfo &info = item.second;
2495         if (info.IsDisabled()) {
2496             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2497             continue;
2498         }
2499         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2500         if (info.GetApplicationEnabled(responseUserId) ||
2501             (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2502             ApplicationInfo appInfo;
2503             info.GetApplicationInfo(flags, responseUserId, appInfo);
2504             appInfos.emplace_back(appInfo);
2505         }
2506         GetCloneAppInfo(info, responseUserId, flags, appInfos);
2507     }
2508     LOG_D(BMS_TAG_QUERY, "get installed bundles success");
2509     return !appInfos.empty();
2510 }
2511 
UpateExtResources(const std::string & bundleName,const std::vector<ExtendResourceInfo> & extendResourceInfos)2512 bool BundleDataMgr::UpateExtResources(const std::string &bundleName,
2513     const std::vector<ExtendResourceInfo> &extendResourceInfos)
2514 {
2515     if (bundleName.empty()) {
2516         APP_LOGW("bundleName is empty");
2517         return false;
2518     }
2519 
2520     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2521     auto infoItem = bundleInfos_.find(bundleName);
2522     if (infoItem == bundleInfos_.end()) {
2523         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2524         return false;
2525     }
2526 
2527     auto info = infoItem->second;
2528     info.AddExtendResourceInfos(extendResourceInfos);
2529     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2530         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2531         return false;
2532     }
2533 
2534     bundleInfos_.at(bundleName) = info;
2535     return true;
2536 }
2537 
RemoveExtResources(const std::string & bundleName,const std::vector<std::string> & moduleNames)2538 bool BundleDataMgr::RemoveExtResources(const std::string &bundleName,
2539     const std::vector<std::string> &moduleNames)
2540 {
2541     if (bundleName.empty()) {
2542         APP_LOGW("bundleName is empty");
2543         return false;
2544     }
2545 
2546     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2547     auto infoItem = bundleInfos_.find(bundleName);
2548     if (infoItem == bundleInfos_.end()) {
2549         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2550         return false;
2551     }
2552 
2553     auto info = infoItem->second;
2554     info.RemoveExtendResourceInfos(moduleNames);
2555     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2556         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2557         return false;
2558     }
2559 
2560     bundleInfos_.at(bundleName) = info;
2561     return true;
2562 }
2563 
UpateCurDynamicIconModule(const std::string & bundleName,const std::string & moduleName)2564 bool BundleDataMgr::UpateCurDynamicIconModule(
2565     const std::string &bundleName, const std::string &moduleName)
2566 {
2567     if (bundleName.empty()) {
2568         APP_LOGW("bundleName is empty");
2569         return false;
2570     }
2571 
2572     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2573     auto infoItem = bundleInfos_.find(bundleName);
2574     if (infoItem == bundleInfos_.end()) {
2575         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2576         return false;
2577     }
2578 
2579     auto info = infoItem->second;
2580     info.SetCurDynamicIconModule(moduleName);
2581     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2582         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2583         return false;
2584     }
2585 
2586     bundleInfos_.at(bundleName) = info;
2587     return true;
2588 }
2589 
GetCloneAppInfoV9(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2590 void BundleDataMgr::GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2591     std::vector<ApplicationInfo> &appInfos) const
2592 {
2593     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2594     for (int32_t appIndex : appIndexVec) {
2595         bool isEnabled = false;
2596         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2597         if (ret != ERR_OK) {
2598             continue;
2599         }
2600         if (isEnabled || (static_cast<uint32_t>(flags) &
2601             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2602             ApplicationInfo cloneAppInfo;
2603             ret = info.GetApplicationInfoV9(flags, userId, cloneAppInfo, appIndex);
2604             if (ret == ERR_OK) {
2605                 appInfos.emplace_back(cloneAppInfo);
2606             }
2607         }
2608     }
2609 }
2610 
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos) const2611 ErrCode BundleDataMgr::GetApplicationInfosV9(
2612     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
2613 {
2614     int32_t requestUserId = GetUserId(userId);
2615     if (requestUserId == Constants::INVALID_USERID) {
2616         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2617     }
2618 
2619     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2620     if (bundleInfos_.empty()) {
2621         APP_LOGW("bundleInfos_ data is empty");
2622         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2623     }
2624     for (const auto &item : bundleInfos_) {
2625         const InnerBundleInfo &info = item.second;
2626         if (info.IsDisabled()) {
2627             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2628             continue;
2629         }
2630         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2631         if (info.GetApplicationEnabled(responseUserId) ||
2632             (static_cast<uint32_t>(flags) &
2633             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2634             ApplicationInfo appInfo;
2635             if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) == ERR_OK) {
2636                 appInfos.emplace_back(appInfo);
2637             }
2638         }
2639         GetCloneAppInfoV9(info, responseUserId, flags, appInfos);
2640     }
2641     APP_LOGD("get installed bundles success");
2642     return ERR_OK;
2643 }
2644 
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const2645 bool BundleDataMgr::GetBundleInfo(
2646     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
2647 {
2648     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2649     if (userId == Constants::ANY_USERID) {
2650         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2651             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2652             return false;
2653         }
2654         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2655     }
2656 
2657     int32_t requestUserId = GetUserId(userId);
2658     if (requestUserId == Constants::INVALID_USERID) {
2659         return false;
2660     }
2661     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2662     InnerBundleInfo innerBundleInfo;
2663     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
2664         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d",
2665             bundleName.c_str(), requestUserId);
2666         return false;
2667     }
2668     // for only one user, bundle info can not be obtained during installation
2669     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2670         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2671         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2672             bundleName.c_str(), requestUserId);
2673         return false;
2674     }
2675 
2676     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2677     innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
2678 
2679     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
2680         ProcessBundleMenu(bundleInfo, flags, false);
2681     }
2682     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) ==
2683         BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) {
2684         ProcessBundleRouterMap(bundleInfo, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
2685             static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP));
2686     }
2687     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2688         bundleName.c_str(), userId);
2689     return true;
2690 }
2691 
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId,int32_t appIndex) const2692 ErrCode BundleDataMgr::GetBundleInfoV9(
2693     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const
2694 {
2695     if (userId == Constants::ANY_USERID) {
2696         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2697         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2698             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2699             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2700         }
2701         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2702     }
2703 
2704     int32_t requestUserId = GetUserId(userId);
2705     if (requestUserId == Constants::INVALID_USERID) {
2706         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2707     }
2708 
2709     int32_t originalUserId = requestUserId;
2710     PreProcessAnyUserFlag(bundleName, flags, requestUserId);
2711     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2712     InnerBundleInfo innerBundleInfo;
2713 
2714     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
2715     if (ret != ERR_OK) {
2716         LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s",
2717             ret, bundleName.c_str());
2718         return ret;
2719     }
2720     // for only one user, bundle info can not be obtained during installation
2721     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2722         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2723         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2724             bundleName.c_str(), requestUserId);
2725         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2726     }
2727 
2728     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2729     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
2730     PostProcessAnyUserFlags(flags, responseUserId, originalUserId, bundleInfo, innerBundleInfo);
2731 
2732     ProcessBundleMenu(bundleInfo, flags, true);
2733     ProcessBundleRouterMap(bundleInfo, flags);
2734     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2735         bundleName.c_str(), userId);
2736     return ERR_OK;
2737 }
2738 
BatchGetBundleInfo(const std::vector<std::string> & bundleNames,int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2739 void BundleDataMgr::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
2740     std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2741 {
2742     for (const auto &bundleName : bundleNames) {
2743         BundleInfo bundleInfo;
2744         ErrCode ret = GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2745         if (ret != ERR_OK) {
2746             continue;
2747         }
2748         bundleInfos.push_back(bundleInfo);
2749     }
2750 }
2751 
GetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2752 ErrCode BundleDataMgr::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2753 {
2754     int32_t uid = IPCSkeleton::GetCallingUid();
2755     int32_t appIndex = 0;
2756     InnerBundleInfo innerBundleInfo;
2757     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
2758         if (sandboxAppHelper_ == nullptr) {
2759             LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
2760             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2761         }
2762         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2763             LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
2764             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2765         }
2766     }
2767     int32_t userId = uid / Constants::BASE_USER_RANGE;
2768     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, userId, appIndex);
2769     ProcessBundleMenu(bundleInfo, flags, true);
2770     ProcessBundleRouterMap(bundleInfo, flags);
2771     LOG_D(BMS_TAG_QUERY, "get bundleInfoForSelf %{public}s successfully in user %{public}d",
2772         innerBundleInfo.GetBundleName().c_str(), userId);
2773     return ERR_OK;
2774 }
2775 
ProcessBundleMenu(BundleInfo & bundleInfo,int32_t flags,bool clearData) const2776 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
2777 {
2778     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2779     if (clearData) {
2780         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2781             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2782             return ERR_OK;
2783         }
2784         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
2785             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
2786             APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
2787             std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
2788                 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
2789             });
2790             return ERR_OK;
2791         }
2792     }
2793     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2794         std::string menuProfile = hapModuleInfo.fileContextMenu;
2795         auto pos = menuProfile.find(PROFILE_PREFIX);
2796         if (pos == std::string::npos) {
2797             APP_LOGD("invalid menu profile");
2798             continue;
2799         }
2800         std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
2801         std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
2802 
2803         std::string menuProfileContent;
2804         GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
2805         hapModuleInfo.fileContextMenu = menuProfileContent;
2806     }
2807     return ERR_OK;
2808 }
2809 
ProcessBundleRouterMap(BundleInfo & bundleInfo,int32_t flag) const2810 void BundleDataMgr::ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const
2811 {
2812     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2813     APP_LOGD("ProcessBundleRouterMap with flags: %{public}d", flag);
2814     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2815         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2816         return;
2817     }
2818     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP))
2819         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP)) {
2820         return;
2821     }
2822     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2823         std::string routerPath = hapModuleInfo.routerMap;
2824         auto pos = routerPath.find(PROFILE_PREFIX);
2825         if (pos == std::string::npos) {
2826             APP_LOGD("invalid router profile");
2827             continue;
2828         }
2829         std::string routerJsonName = routerPath.substr(pos + PROFILE_PREFIX_LENGTH);
2830         std::string routerJsonPath = PROFILE_PATH + routerJsonName + JSON_SUFFIX;
2831 
2832         std::string routerMapString;
2833         if (GetJsonProfileByExtractor(hapModuleInfo.hapPath, routerJsonPath, routerMapString) != ERR_OK) {
2834             APP_LOGW("get json string from %{public}s failed", routerJsonPath.c_str());
2835             continue;
2836         }
2837 
2838         BundleParser bundleParser;
2839         if (bundleParser.ParseRouterArray(routerMapString, hapModuleInfo.routerArray) != ERR_OK) {
2840             APP_LOGE("parse router array from json file %{public}s failed", routerJsonPath.c_str());
2841         }
2842     }
2843     RouterMapHelper::MergeRouter(bundleInfo);
2844 }
2845 
PreProcessAnyUserFlag(const std::string & bundleName,int32_t & flags,int32_t & userId) const2846 void BundleDataMgr::PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const
2847 {
2848     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0) {
2849         flags = static_cast<int32_t>(
2850             static_cast<uint32_t>(flags) | static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE));
2851         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2852         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2853             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2854             return;
2855         }
2856         if (innerBundleUserInfos.empty()) {
2857             return;
2858         }
2859         for (auto &bundleUserInfo: innerBundleUserInfos) {
2860             if (bundleUserInfo.bundleUserInfo.userId == userId) {
2861                 return;
2862             }
2863             if (bundleUserInfo.bundleUserInfo.userId < Constants::START_USERID) {
2864                 return;
2865             }
2866         }
2867         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2868     }
2869 }
2870 
PostProcessAnyUserFlags(int32_t flags,int32_t userId,int32_t originalUserId,BundleInfo & bundleInfo,const InnerBundleInfo & innerBundleInfo) const2871 void BundleDataMgr::PostProcessAnyUserFlags(
2872     int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo,
2873     const InnerBundleInfo &innerBundleInfo) const
2874 {
2875     bool withApplicationFlag =
2876         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION))
2877             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
2878     if (withApplicationFlag) {
2879         if (userId >= Constants::START_USERID && userId != originalUserId) {
2880             uint32_t flagInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_INSTALLED);
2881             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
2882             if ((applicationFlags & flagInstalled) != 0) {
2883                 bundleInfo.applicationInfo.applicationFlags = static_cast<int32_t>(applicationFlags ^ flagInstalled);
2884             }
2885         }
2886 
2887         bool withAnyUser =
2888             (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER))
2889                 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER);
2890         if (withAnyUser) {
2891             const std::map<std::string, InnerBundleUserInfo>& innerUserInfos
2892                 = innerBundleInfo.GetInnerBundleUserInfos();
2893             uint32_t flagOtherInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_OTHER_INSTALLED);
2894             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
2895             if (!innerBundleInfo.HasInnerBundleUserInfo(originalUserId)) {
2896                 bundleInfo.applicationInfo.applicationFlags =
2897                     static_cast<int32_t>(applicationFlags | flagOtherInstalled);
2898             } else if (innerUserInfos.size() > 1) {
2899                 bundleInfo.applicationInfo.applicationFlags =
2900                     static_cast<int32_t>(applicationFlags | flagOtherInstalled);
2901             }
2902         }
2903     }
2904 }
2905 
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,GetDependentBundleInfoFlag flag) const2906 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
2907     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
2908 {
2909     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
2910     if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
2911         (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
2912         // for app service hsp
2913         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2914         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
2915         for (const std::string &hspName : appServiceHspBundleName_) {
2916             APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
2917             auto infoItem = bundleInfos_.find(hspName);
2918             if (infoItem == bundleInfos_.end()) {
2919                 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
2920                 continue;
2921             }
2922             ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
2923         }
2924     }
2925     if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
2926         flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
2927         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2928         auto infoItem = bundleInfos_.find(bundleName);
2929         if (infoItem == bundleInfos_.end()) {
2930             APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
2931             return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
2932                 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
2933         }
2934         const InnerBundleInfo &innerBundleInfo = infoItem->second;
2935         std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
2936         for (const auto &item : dependencies) {
2937             BaseSharedBundleInfo baseSharedBundleInfo;
2938             if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
2939                 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
2940             }
2941         }
2942     }
2943     APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
2944     return ERR_OK;
2945 }
2946 
GetBundleType(const std::string & bundleName,BundleType & bundleType) const2947 bool BundleDataMgr::GetBundleType(const std::string &bundleName, BundleType &bundleType)const
2948 {
2949     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2950     auto item = bundleInfos_.find(bundleName);
2951     if (item == bundleInfos_.end()) {
2952         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2953         return false;
2954     }
2955     bundleType = item->second.GetApplicationBundleType();
2956     APP_LOGI("bundle %{public}s bundleType is %{public}d", bundleName.c_str(), bundleType);
2957     return true;
2958 }
2959 
GetBaseSharedBundleInfo(const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const2960 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
2961     BaseSharedBundleInfo &baseSharedBundleInfo) const
2962 {
2963     auto infoItem = bundleInfos_.find(dependency.bundleName);
2964     if (infoItem == bundleInfos_.end()) {
2965         APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
2966             dependency.bundleName.c_str());
2967         return false;
2968     }
2969     const InnerBundleInfo &innerBundleInfo = infoItem->second;
2970     if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
2971         innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
2972     } else {
2973         APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
2974             innerBundleInfo.GetApplicationBundleType());
2975         return false;
2976     }
2977     APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
2978     return true;
2979 }
2980 
DeleteSharedBundleInfo(const std::string & bundleName)2981 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
2982 {
2983     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2984     auto infoItem = bundleInfos_.find(bundleName);
2985     if (infoItem != bundleInfos_.end()) {
2986         APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
2987         const InnerBundleInfo &innerBundleInfo = infoItem->second;
2988         bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
2989         if (!ret) {
2990             APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
2991         }
2992         bundleInfos_.erase(bundleName);
2993         return ret;
2994     }
2995     return false;
2996 }
2997 
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId) const2998 ErrCode BundleDataMgr::GetBundlePackInfo(
2999     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
3000 {
3001     APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
3002     int32_t requestUserId;
3003     if (userId == Constants::UNSPECIFIED_USERID) {
3004         requestUserId = GetUserIdByCallingUid();
3005     } else {
3006         requestUserId = userId;
3007     }
3008 
3009     if (requestUserId == Constants::INVALID_USERID) {
3010         APP_LOGW("getBundlePackInfo userId is invalid");
3011         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3012     }
3013     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3014     InnerBundleInfo innerBundleInfo;
3015     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
3016         APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
3017         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3018     }
3019     BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
3020     if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
3021         bundlePackInfo.packages = innerBundlePackInfo.packages;
3022         return ERR_OK;
3023     }
3024     if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
3025         bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
3026         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3027         return ERR_OK;
3028     }
3029     if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
3030         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3031         return ERR_OK;
3032     }
3033     bundlePackInfo = innerBundlePackInfo;
3034     return ERR_OK;
3035 }
3036 
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos) const3037 bool BundleDataMgr::GetBundleInfosByMetaData(
3038     const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
3039 {
3040     if (metaData.empty()) {
3041         APP_LOGW("bundle name is empty");
3042         return false;
3043     }
3044 
3045     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3046     if (bundleInfos_.empty()) {
3047         APP_LOGW("bundleInfos_ data is empty");
3048         return false;
3049     }
3050 
3051     bool find = false;
3052     int32_t requestUserId = GetUserId();
3053     for (const auto &item : bundleInfos_) {
3054         const InnerBundleInfo &info = item.second;
3055         if (info.IsDisabled()) {
3056             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3057             continue;
3058         }
3059         if (info.CheckSpecialMetaData(metaData)) {
3060             BundleInfo bundleInfo;
3061             int32_t responseUserId = info.GetResponseUserId(requestUserId);
3062             info.GetBundleInfo(
3063                 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3064             bundleInfos.emplace_back(bundleInfo);
3065             find = true;
3066         }
3067     }
3068     return find;
3069 }
3070 
GetBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3071 bool BundleDataMgr::GetBundleList(
3072     std::vector<std::string> &bundleNames, int32_t userId) const
3073 {
3074     int32_t requestUserId = GetUserId(userId);
3075     if (requestUserId == Constants::INVALID_USERID) {
3076         return false;
3077     }
3078 
3079     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3080     if (bundleInfos_.empty()) {
3081         APP_LOGW("bundleInfos_ data is empty");
3082         return false;
3083     }
3084 
3085     bool find = false;
3086     for (const auto &infoItem : bundleInfos_) {
3087         const InnerBundleInfo &innerBundleInfo = infoItem.second;
3088         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3089         if (CheckInnerBundleInfoWithFlags(
3090             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3091             continue;
3092         }
3093 
3094         bundleNames.emplace_back(infoItem.first);
3095         find = true;
3096     }
3097     APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
3098     return find;
3099 }
3100 
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3101 bool BundleDataMgr::GetBundleInfos(
3102     int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3103 {
3104     if (userId == Constants::ALL_USERID) {
3105         return GetAllBundleInfos(flags, bundleInfos);
3106     }
3107 
3108     int32_t requestUserId = GetUserId(userId);
3109     if (requestUserId == Constants::INVALID_USERID) {
3110         return false;
3111     }
3112 
3113     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3114     if (bundleInfos_.empty()) {
3115         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3116         return false;
3117     }
3118 
3119     bool find = false;
3120     for (const auto &item : bundleInfos_) {
3121         const InnerBundleInfo &innerBundleInfo = item.second;
3122         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3123             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3124                 innerBundleInfo.GetBundleName().c_str());
3125             continue;
3126         }
3127 
3128         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3129         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
3130             continue;
3131         }
3132 
3133         BundleInfo bundleInfo;
3134         if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
3135             continue;
3136         }
3137 
3138         bundleInfos.emplace_back(bundleInfo);
3139         find = true;
3140         // add clone bundle info
3141         // flags convert
3142         GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3143     }
3144 
3145     LOG_D(BMS_TAG_QUERY, "get bundleInfos result(%{public}d) in user(%{public}d)", find, userId);
3146     return find;
3147 }
3148 
CheckInnerBundleInfoWithFlags(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3149 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
3150     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3151 {
3152     if (userId == Constants::INVALID_USERID) {
3153         APP_LOGD("userId is invalid");
3154         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3155     }
3156     if (innerBundleInfo.IsDisabled()) {
3157         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3158         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3159     }
3160 
3161     if (appIndex == 0) {
3162         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
3163             && !innerBundleInfo.GetApplicationEnabled(userId)) {
3164             APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3165                 innerBundleInfo.GetBundleName().c_str(), userId);
3166             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3167         }
3168     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3169         int32_t requestUserId = GetUserId(userId);
3170         if (requestUserId == Constants::INVALID_USERID) {
3171             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3172         }
3173         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3174         bool isEnabled = false;
3175         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3176         if (ret != ERR_OK) {
3177             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3178         }
3179         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
3180             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3181                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3182             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3183         }
3184     } else {
3185         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3186     }
3187     return ERR_OK;
3188 }
3189 
CheckInnerBundleInfoWithFlagsV9(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3190 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlagsV9(
3191     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3192 {
3193     if (userId == Constants::INVALID_USERID) {
3194         APP_LOGD("userId is invalid");
3195         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3196     }
3197     if (innerBundleInfo.IsDisabled()) {
3198         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3199         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3200     }
3201 
3202     if (appIndex == 0) {
3203         if (!(static_cast<uint32_t>(flags) &
3204             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
3205             bool isEnabled = false;
3206             ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(userId, isEnabled, appIndex);
3207             if (ret != ERR_OK) {
3208                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3209                     innerBundleInfo.GetBundleName().c_str(), userId);
3210                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3211             }
3212             if (!isEnabled) {
3213                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3214                     innerBundleInfo.GetBundleName().c_str(), userId);
3215                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3216             }
3217         }
3218     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3219         int32_t requestUserId = GetUserId(userId);
3220         if (requestUserId == Constants::INVALID_USERID) {
3221             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3222         }
3223         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3224         bool isEnabled = false;
3225         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3226         if (ret != ERR_OK) {
3227             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3228         }
3229         if (!(static_cast<uint32_t>(flags) &
3230             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
3231             && !isEnabled) {
3232             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3233                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3234             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3235         }
3236     } else {
3237         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3238     }
3239     return ERR_OK;
3240 }
3241 
GetAllBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3242 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3243 {
3244     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3245     if (bundleInfos_.empty()) {
3246         APP_LOGW("bundleInfos_ data is empty");
3247         return false;
3248     }
3249 
3250     bool find = false;
3251     for (const auto &item : bundleInfos_) {
3252         const InnerBundleInfo &info = item.second;
3253         if (info.IsDisabled()) {
3254             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3255             continue;
3256         }
3257         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3258             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3259             continue;
3260         }
3261         BundleInfo bundleInfo;
3262         info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
3263         bundleInfos.emplace_back(bundleInfo);
3264         find = true;
3265         // add clone bundle info
3266         GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3267     }
3268 
3269     APP_LOGD("get all bundleInfos result(%{public}d)", find);
3270     return find;
3271 }
3272 
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3273 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3274 {
3275     if (userId == Constants::ALL_USERID) {
3276         return GetAllBundleInfosV9(flags, bundleInfos);
3277     }
3278     int32_t requestUserId = GetUserId(userId);
3279     if (requestUserId == Constants::INVALID_USERID) {
3280         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3281     }
3282     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3283     if (bundleInfos_.empty()) {
3284         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3285         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3286     }
3287     bool ofAnyUserFlag =
3288         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0;
3289     for (const auto &item : bundleInfos_) {
3290         const InnerBundleInfo &innerBundleInfo = item.second;
3291         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3292             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3293                 innerBundleInfo.GetBundleName().c_str());
3294             continue;
3295         }
3296         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3297         auto flag = GET_BASIC_APPLICATION_INFO;
3298         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
3299             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
3300             flag = GET_APPLICATION_INFO_WITH_DISABLE;
3301         }
3302         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
3303             auto &hp = innerBundleInfo.GetInnerBundleUserInfos();
3304             if (ofAnyUserFlag && hp.size() > 0) {
3305                 responseUserId = hp.begin()->second.bundleUserInfo.userId;
3306             } else {
3307                 continue;
3308             }
3309         }
3310         uint32_t launchFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY);
3311         if (((static_cast<uint32_t>(flags) & launchFlag) == launchFlag) && (innerBundleInfo.IsHideDesktopIcon())) {
3312             LOG_D(BMS_TAG_QUERY, "bundleName %{public}s is hide desktopIcon",
3313                 innerBundleInfo.GetBundleName().c_str());
3314             continue;
3315         }
3316         BundleInfo bundleInfo;
3317         if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
3318             continue;
3319         }
3320         ProcessBundleMenu(bundleInfo, flags, true);
3321         ProcessBundleRouterMap(bundleInfo, flags);
3322         PostProcessAnyUserFlags(flags, responseUserId, requestUserId, bundleInfo, innerBundleInfo);
3323         bundleInfos.emplace_back(bundleInfo);
3324         if (!ofAnyUserFlag && (((static_cast<uint32_t>(flags) &
3325             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3326             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)))) {
3327             GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3328         }
3329     }
3330     if (bundleInfos.empty()) {
3331         LOG_W(BMS_TAG_QUERY, "bundleInfos is empty");
3332     }
3333     return ERR_OK;
3334 }
3335 
GetAllBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3336 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3337 {
3338     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3339     if (bundleInfos_.empty()) {
3340         APP_LOGW("bundleInfos_ data is empty");
3341         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3342     }
3343 
3344     for (const auto &item : bundleInfos_) {
3345         const InnerBundleInfo &info = item.second;
3346         if (info.IsDisabled()) {
3347             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3348             continue;
3349         }
3350         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3351             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3352             continue;
3353         }
3354         if (((static_cast<uint32_t>(flags) &
3355             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) ==
3356             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) &&
3357             (info.IsHideDesktopIcon())) {
3358             APP_LOGD("getAllBundleInfosV9 bundleName %{public}s is hide desktopIcon",
3359                 info.GetBundleName().c_str());
3360             continue;
3361         }
3362         BundleInfo bundleInfo;
3363         info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
3364         auto ret = ProcessBundleMenu(bundleInfo, flags, true);
3365         if (ret == ERR_OK) {
3366             bundleInfos.emplace_back(bundleInfo);
3367             if (((static_cast<uint32_t>(flags) &
3368                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3369                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3370                 // add clone bundle info
3371                 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3372             }
3373         }
3374     }
3375     if (bundleInfos.empty()) {
3376         APP_LOGW("bundleInfos is empty");
3377     }
3378     return ERR_OK;
3379 }
3380 
GetBundleNameForUid(const int32_t uid,std::string & bundleName) const3381 bool BundleDataMgr::GetBundleNameForUid(const int32_t uid, std::string &bundleName) const
3382 {
3383     int32_t appIndex = 0;
3384     return GetBundleNameAndIndexForUid(uid, bundleName, appIndex) == ERR_OK;
3385 }
3386 
GetBundleNameAndIndexForUid(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3387 ErrCode BundleDataMgr::GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName,
3388     int32_t &appIndex) const
3389 {
3390     InnerBundleInfo innerBundleInfo;
3391     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
3392         if (sandboxAppHelper_ == nullptr) {
3393             return ERR_BUNDLE_MANAGER_INVALID_UID;
3394         }
3395         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3396             return ERR_BUNDLE_MANAGER_INVALID_UID;
3397         }
3398     }
3399 
3400     bundleName = innerBundleInfo.GetBundleName();
3401     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
3402         uid, bundleName.c_str(), appIndex);
3403     return ERR_OK;
3404 }
3405 
GetInnerBundleInfoAndIndexByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo,int32_t & appIndex) const3406 ErrCode BundleDataMgr::GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo,
3407     int32_t &appIndex) const
3408 {
3409     if (uid < Constants::BASE_APP_UID) {
3410         APP_LOGD("the uid(%{public}d) is not an application", uid);
3411         return ERR_BUNDLE_MANAGER_INVALID_UID;
3412     }
3413     int32_t userId = GetUserIdByUid(uid);
3414     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3415 
3416     std::string keyName;
3417     {
3418         std::shared_lock<std::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3419         auto bundleIdIter = bundleIdMap_.find(bundleId);
3420         if (bundleIdIter == bundleIdMap_.end()) {
3421             APP_LOGW_NOFUNC("uid %{public}d is not existed", uid);
3422             return ERR_BUNDLE_MANAGER_INVALID_UID;
3423         }
3424         keyName = bundleIdIter->second;
3425     }
3426     std::string bundleName = keyName;
3427     GetBundleNameAndIndexByName(keyName, bundleName, appIndex);
3428 
3429     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3430     auto bundleInfoIter = bundleInfos_.find(bundleName);
3431     if (bundleInfoIter == bundleInfos_.end()) {
3432         APP_LOGE("bundleName %{public}s is not existed in bundleInfos_", bundleName.c_str());
3433         return ERR_BUNDLE_MANAGER_INVALID_UID;
3434     }
3435 
3436     if (bundleInfoIter->second.GetUid(userId, appIndex) == uid) {
3437         innerBundleInfo = bundleInfoIter->second;
3438         return ERR_OK;
3439     }
3440 
3441     APP_LOGW("the uid(%{public}d) is not exists", uid);
3442     return ERR_BUNDLE_MANAGER_INVALID_UID;
3443 }
3444 
GetInnerBundleInfoByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo) const3445 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const
3446 {
3447     int32_t appIndex = 0;
3448     return GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex);
3449 }
3450 
GetRecoverablePreInstallBundleInfos()3451 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
3452 {
3453     std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
3454     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3455     if (userId == Constants::INVALID_USERID) {
3456         APP_LOGW("userId %{public}d is invalid", userId);
3457         return recoverablePreInstallBundleInfos;
3458     }
3459     std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
3460     for (auto preInstallBundleInfo: preInstallBundleInfos) {
3461         if (!preInstallBundleInfo.IsRemovable()) {
3462             continue;
3463         }
3464         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3465         auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
3466         if (infoItem == bundleInfos_.end()) {
3467             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3468             continue;
3469         }
3470         if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
3471             !infoItem->second.HasInnerBundleUserInfo(userId)) {
3472             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3473         }
3474     }
3475     return recoverablePreInstallBundleInfos;
3476 }
3477 
IsBundleExist(const std::string & bundleName) const3478 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
3479 {
3480     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3481     return bundleInfos_.find(bundleName) != bundleInfos_.end();
3482 }
3483 
HasUserInstallInBundle(const std::string & bundleName,const int32_t userId) const3484 bool BundleDataMgr::HasUserInstallInBundle(
3485     const std::string &bundleName, const int32_t userId) const
3486 {
3487     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3488     auto infoItem = bundleInfos_.find(bundleName);
3489     if (infoItem == bundleInfos_.end()) {
3490         return false;
3491     }
3492 
3493     return infoItem->second.HasInnerBundleUserInfo(userId);
3494 }
3495 
3496 #ifdef ABILITY_RUNTIME_ENABLE
GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,const std::string & bundleName,const std::vector<int32_t> & cloneAppIndexes) const3497 std::vector<int32_t> BundleDataMgr::GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,
3498     const std::string &bundleName, const std::vector<int32_t> &cloneAppIndexes) const
3499 {
3500     std::vector<int32_t> noRunningCloneAppIndexes;
3501     if (appMgrProxy == nullptr) {
3502         APP_LOGW("CleanBundleCache fail to find the app mgr service to check app is running");
3503         return noRunningCloneAppIndexes;
3504     }
3505 
3506     for (const auto &appIndex : cloneAppIndexes) {
3507         bool running = SystemAbilityHelper::IsAppRunning(appMgrProxy, bundleName, appIndex);
3508         if (running) {
3509             APP_LOGW("No del cache for %{public}s[%{public}d]: is running", bundleName.c_str(), appIndex);
3510             continue;
3511         }
3512         noRunningCloneAppIndexes.emplace_back(appIndex);
3513     }
3514     return noRunningCloneAppIndexes;
3515 }
3516 #endif
3517 
GetBundleCacheInfo(std::function<std::vector<int32_t> (std::string &,std::vector<int32_t> &)> idxFilter,const InnerBundleInfo & info,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,const int32_t userId,bool isClean) const3518 void BundleDataMgr::GetBundleCacheInfo(
3519     std::function<std::vector<int32_t>(std::string&, std::vector<int32_t>&)> idxFilter,
3520     const InnerBundleInfo &info,
3521     std::vector<std::tuple<std::string, std::vector<std::string>, std::vector<int32_t>>> &validBundles,
3522     const int32_t userId, bool isClean) const
3523 {
3524     std::string bundleName = info.GetBundleName();
3525     if (isClean && !info.GetBaseApplicationInfo().userDataClearable) {
3526         APP_LOGW("Not clearable:%{public}s, userid:%{public}d", bundleName.c_str(), userId);
3527         return;
3528     }
3529     std::vector<std::string> moduleNameList;
3530     info.GetModuleNames(moduleNameList);
3531     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
3532     cloneAppIndexes.emplace_back(0);
3533     std::vector<int32_t> allAppIndexes = cloneAppIndexes;
3534     if (isClean) {
3535         allAppIndexes = idxFilter(bundleName, cloneAppIndexes);
3536     }
3537     validBundles.emplace_back(std::make_tuple(bundleName, moduleNameList, allAppIndexes));
3538     // add atomic service
3539     if (info.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE) {
3540         std::string atomicServiceName;
3541         AccountSA::OhosAccountInfo accountInfo;
3542         auto ret = GetDirForAtomicServiceByUserId(bundleName, userId, accountInfo, atomicServiceName);
3543         if (ret == ERR_OK && !atomicServiceName.empty()) {
3544             APP_LOGD("atomicServiceName: %{public}s", atomicServiceName.c_str());
3545             validBundles.emplace_back(std::make_tuple(atomicServiceName, moduleNameList, allAppIndexes));
3546         }
3547     }
3548 }
3549 
GetBundleCacheInfos(const int32_t userId,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,bool isClean) const3550 void BundleDataMgr::GetBundleCacheInfos(const int32_t userId, std::vector<std::tuple<std::string,
3551     std::vector<std::string>, std::vector<int32_t>>> &validBundles, bool isClean) const
3552 {
3553 #ifdef ABILITY_RUNTIME_ENABLE
3554     sptr<IAppMgr> appMgrProxy = iface_cast<IAppMgr>(SystemAbilityHelper::GetSystemAbility(APP_MGR_SERVICE_ID));
3555     if (appMgrProxy == nullptr) {
3556         APP_LOGE("CleanBundleCache fail to find the app mgr service to check app is running");
3557         return;
3558     }
3559     auto idxFiltor = [&appMgrProxy, this](std::string &bundleName, std::vector<int32_t> &allidx) {
3560         return this->GetNoRunningBundleCloneIndexes(appMgrProxy, bundleName, allidx);
3561     };
3562 #else
3563     auto idxFiltor = [](std::string &bundleName, std::vector<int32_t> &allidx) {
3564         return allidx;
3565     };
3566 #endif
3567     std::map<std::string, InnerBundleInfo> infos = GetAllInnerBundleInfos();
3568     for (const auto &item : infos) {
3569         GetBundleCacheInfo(idxFiltor, item.second, validBundles, userId, isClean);
3570     }
3571     return;
3572 }
3573 
GetBundleStats(const std::string & bundleName,const int32_t userId,std::vector<int64_t> & bundleStats,const int32_t appIndex,const uint32_t statFlag) const3574 bool BundleDataMgr::GetBundleStats(const std::string &bundleName,
3575     const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex, const uint32_t statFlag) const
3576 {
3577     int32_t responseUserId = -1;
3578     int32_t uid = -1;
3579     std::vector<std::string> moduleNameList;
3580     {
3581         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3582         const auto infoItem = bundleInfos_.find(bundleName);
3583         if (infoItem == bundleInfos_.end()) {
3584             return false;
3585         }
3586         responseUserId = infoItem->second.GetResponseUserId(userId);
3587         uid = infoItem->second.GetUid(responseUserId, appIndex);
3588         infoItem->second.GetModuleNames(moduleNameList);
3589     }
3590     ErrCode ret = InstalldClient::GetInstance()->GetBundleStats(
3591         bundleName, responseUserId, bundleStats, uid, appIndex, statFlag, moduleNameList);
3592     if (ret != ERR_OK) {
3593         APP_LOGW("%{public}s getStats failed", bundleName.c_str());
3594         return false;
3595     }
3596     {
3597         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3598         const auto infoItem = bundleInfos_.find(bundleName);
3599         if (infoItem == bundleInfos_.end()) {
3600             return false;
3601         }
3602         if (appIndex == 0 && infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
3603             for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
3604                 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
3605                     continue;
3606                 }
3607                 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
3608             }
3609         }
3610     }
3611 
3612     return true;
3613 }
3614 
GetBundleModuleNames(const std::string & bundleName,std::vector<std::string> & moduleNameList) const3615 void BundleDataMgr::GetBundleModuleNames(const std::string &bundleName,
3616     std::vector<std::string> &moduleNameList) const
3617 {
3618     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3619     const auto infoItem = bundleInfos_.find(bundleName);
3620     if (infoItem == bundleInfos_.end()) {
3621         APP_LOGW("No modules of: %{public}s", bundleName.c_str());
3622         return;
3623     }
3624     infoItem->second.GetModuleNames(moduleNameList);
3625 }
3626 
GetAllBundleStats(const int32_t userId,std::vector<int64_t> & bundleStats) const3627 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
3628 {
3629     std::vector<int32_t> uids;
3630     int32_t responseUserId = userId;
3631     int32_t requestUserId = GetUserId(userId);
3632     if (requestUserId == Constants::INVALID_USERID) {
3633         APP_LOGE("invalid userid :%{public}d", userId);
3634         return false;
3635     }
3636     {
3637         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3638         for (const auto &item : bundleInfos_) {
3639             const InnerBundleInfo &info = item.second;
3640             std::string bundleName = info.GetBundleName();
3641             responseUserId = info.GetResponseUserId(requestUserId);
3642             if (responseUserId == Constants::INVALID_USERID) {
3643                 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
3644                 continue;
3645             }
3646             BundleType type = info.GetApplicationBundleType();
3647             if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
3648                 APP_LOGD("BundleType is invalid: %{public}d, bundname: %{public}s", type, bundleName.c_str());
3649                 continue;
3650             }
3651             std::vector<int32_t> allAppIndexes = {0};
3652             if (type == BundleType::APP) {
3653                 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
3654                 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
3655             }
3656             for (int32_t appIndex: allAppIndexes) {
3657                 int32_t uid = info.GetUid(responseUserId, appIndex);
3658                 uids.emplace_back(uid);
3659             }
3660         }
3661     }
3662     if (InstalldClient::GetInstance()->GetAllBundleStats(responseUserId, bundleStats, uids) != ERR_OK) {
3663         APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
3664         return false;
3665     }
3666     if (bundleStats.empty()) {
3667         APP_LOGE("bundle stats is empty");
3668         return true;
3669     }
3670     return true;
3671 }
3672 
3673 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string & bundleName) const3674 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
3675 {
3676     return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
3677 }
3678 
GetBundleSpaceSize(const std::string & bundleName,int32_t userId) const3679 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
3680 {
3681     int64_t spaceSize = 0;
3682     if (userId != Constants::ALL_USERID) {
3683         std::vector<int64_t> bundleStats;
3684         if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
3685             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
3686             return spaceSize;
3687         }
3688 
3689         spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
3690         return spaceSize;
3691     }
3692 
3693     for (const auto &iterUserId : GetAllUser()) {
3694         std::vector<int64_t> bundleStats;
3695         if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
3696             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
3697             continue;
3698         }
3699 
3700         auto startIter = bundleStats.begin();
3701         auto endIter = bundleStats.end();
3702         if (spaceSize == 0) {
3703             spaceSize = std::accumulate(startIter, endIter, spaceSize);
3704         } else {
3705             spaceSize = std::accumulate(++startIter, endIter, spaceSize);
3706         }
3707     }
3708 
3709     return spaceSize;
3710 }
3711 
GetAllFreeInstallBundleSpaceSize() const3712 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
3713 {
3714     int64_t allSize = 0;
3715     std::map<std::string, std::vector<std::string>> freeInstallModules;
3716     if (!GetFreeInstallModules(freeInstallModules)) {
3717         APP_LOGW("no removable bundles");
3718         return allSize;
3719     }
3720 
3721     for (const auto &iter : freeInstallModules) {
3722         APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
3723         allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
3724     }
3725 
3726     APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
3727     return allSize;
3728 }
3729 
GetFreeInstallModules(std::map<std::string,std::vector<std::string>> & freeInstallModules) const3730 bool BundleDataMgr::GetFreeInstallModules(
3731     std::map<std::string, std::vector<std::string>> &freeInstallModules) const
3732 {
3733     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3734     if (bundleInfos_.empty()) {
3735         APP_LOGW("bundleInfos_ is data is empty");
3736         return false;
3737     }
3738 
3739     for (const auto &iter : bundleInfos_) {
3740         std::vector<std::string> modules;
3741         if (!iter.second.GetFreeInstallModules(modules)) {
3742             continue;
3743         }
3744 
3745         freeInstallModules.emplace(iter.first, modules);
3746     }
3747 
3748     return !freeInstallModules.empty();
3749 }
3750 #endif
3751 
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames) const3752 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
3753 {
3754     InnerBundleInfo innerBundleInfo;
3755     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3756         APP_LOGD("get innerBundleInfo by uid :%{public}d failed", uid);
3757         return false;
3758     }
3759 
3760     bundleNames.emplace_back(innerBundleInfo.GetBundleName());
3761     return true;
3762 }
3763 
GetNameForUid(const int uid,std::string & name) const3764 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
3765 {
3766     InnerBundleInfo innerBundleInfo;
3767     ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
3768     if (ret != ERR_OK) {
3769         APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed");
3770         if (sandboxAppHelper_ == nullptr) {
3771             APP_LOGW("sandboxAppHelper_ is nullptr");
3772             return ERR_BUNDLE_MANAGER_INVALID_UID;
3773         }
3774         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3775             return ERR_BUNDLE_MANAGER_INVALID_UID;
3776         }
3777     }
3778 
3779     name = innerBundleInfo.GetBundleName();
3780     return ERR_OK;
3781 }
3782 
GetBundleGids(const std::string & bundleName,std::vector<int> & gids) const3783 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
3784 {
3785     int32_t requestUserId = GetUserId();
3786     InnerBundleUserInfo innerBundleUserInfo;
3787     if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
3788         APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) ",
3789             requestUserId, bundleName.c_str());
3790         return false;
3791     }
3792 
3793     gids = innerBundleUserInfo.gids;
3794     return true;
3795 }
3796 
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids) const3797 bool BundleDataMgr::GetBundleGidsByUid(
3798     const std::string &bundleName, const int &uid, std::vector<int> &gids) const
3799 {
3800     return true;
3801 }
3802 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos) const3803 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
3804 {
3805     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3806     if (bundleInfos_.empty()) {
3807         APP_LOGW("bundleInfos_ data is empty");
3808         return false;
3809     }
3810 
3811     int32_t requestUserId = GetUserId();
3812     for (const auto &info : bundleInfos_) {
3813         if (info.second.IsDisabled()) {
3814             APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
3815             continue;
3816         }
3817         if (info.second.GetIsKeepAlive()) {
3818             BundleInfo bundleInfo;
3819             int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
3820             info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3821             if (bundleInfo.name == "") {
3822                 continue;
3823             }
3824             bundleInfos.emplace_back(bundleInfo);
3825         }
3826     }
3827     return !(bundleInfos.empty());
3828 }
3829 
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label) const3830 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
3831     const std::string &abilityName, std::string &label) const
3832 {
3833 #ifdef GLOBAL_RESMGR_ENABLE
3834     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3835     int32_t requestUserId = GetUserId();
3836     if (requestUserId == Constants::INVALID_USERID) {
3837         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3838     }
3839     InnerBundleInfo innerBundleInfo;
3840     ErrCode ret =
3841         GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
3842     if (ret != ERR_OK) {
3843         return ret;
3844     }
3845     AbilityInfo abilityInfo;
3846     ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
3847     if (ret != ERR_OK) {
3848         APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
3849             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
3850         return ret;
3851     }
3852     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3853     bool isEnable = false;
3854     ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
3855     if (ret != ERR_OK) {
3856         return ret;
3857     }
3858     if (!isEnable) {
3859         APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
3860         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
3861     }
3862     if (abilityInfo.labelId == 0) {
3863         label = abilityInfo.label;
3864         return ERR_OK;
3865     }
3866     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
3867         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
3868     if (resourceManager == nullptr) {
3869         APP_LOGW("InitResourceManager failed");
3870         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3871     }
3872     auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
3873     if (state != OHOS::Global::Resource::RState::SUCCESS) {
3874         APP_LOGW("ResourceManager GetStringById failed");
3875         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3876     }
3877     return ERR_OK;
3878 #else
3879     APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
3880     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
3881 #endif
3882 }
3883 
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo,int32_t userId) const3884 bool BundleDataMgr::GetHapModuleInfo(
3885     const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
3886 {
3887     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3888     int32_t requestUserId = GetUserId(userId);
3889     if (requestUserId == Constants::INVALID_USERID) {
3890         return false;
3891     }
3892 
3893     if (bundleInfos_.empty()) {
3894         APP_LOGW("bundleInfos_ data is empty");
3895         return false;
3896     }
3897 
3898     APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
3899     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
3900     if (infoItem == bundleInfos_.end()) {
3901         return false;
3902     }
3903 
3904     const InnerBundleInfo &innerBundleInfo = infoItem->second;
3905     if (innerBundleInfo.IsDisabled()) {
3906         APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
3907         return false;
3908     }
3909 
3910     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3911     auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
3912     if (!module) {
3913         APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
3914             abilityInfo.bundleName.c_str());
3915         return false;
3916     }
3917     hapModuleInfo = *module;
3918     return true;
3919 }
3920 
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId) const3921 ErrCode BundleDataMgr::GetLaunchWantForBundle(
3922     const std::string &bundleName, Want &want, int32_t userId) const
3923 {
3924     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3925     InnerBundleInfo innerBundleInfo;
3926     ErrCode ret = GetInnerBundleInfoWithFlagsV9(
3927         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
3928     if (ret != ERR_OK) {
3929         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
3930         return ret;
3931     }
3932 
3933     std::string mainAbility = innerBundleInfo.GetMainAbility();
3934     if (mainAbility.empty()) {
3935         APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
3936         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3937     }
3938 
3939     want.SetElementName("", bundleName, mainAbility);
3940     want.SetAction(Constants::ACTION_HOME);
3941     want.AddEntity(Constants::ENTITY_HOME);
3942     return ERR_OK;
3943 }
3944 
CheckIsSystemAppByUid(const int uid) const3945 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
3946 {
3947     // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
3948     // the uid should be the system uid.
3949     if (uid == Constants::ROOT_UID || uid == ServiceConstants::BMS_UID) {
3950         return true;
3951     }
3952 
3953     InnerBundleInfo innerBundleInfo;
3954     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3955         return false;
3956     }
3957 
3958     return innerBundleInfo.IsSystemApp();
3959 }
3960 
InitStateTransferMap()3961 void BundleDataMgr::InitStateTransferMap()
3962 {
3963     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
3964     transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
3965     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
3966     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
3967     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
3968     transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
3969     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
3970     transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
3971     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
3972     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
3973     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
3974     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
3975     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
3976     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
3977     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
3978     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
3979     transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
3980     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
3981     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
3982     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
3983     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
3984     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
3985     transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
3986     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
3987     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
3988     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
3989     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
3990     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
3991 }
3992 
IsDeleteDataState(const InstallState state) const3993 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
3994 {
3995     return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
3996             state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
3997 }
3998 
IsDisableState(const InstallState state) const3999 bool BundleDataMgr::IsDisableState(const InstallState state) const
4000 {
4001     if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
4002         return true;
4003     }
4004     return false;
4005 }
4006 
DeleteBundleInfo(const std::string & bundleName,const InstallState state)4007 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state)
4008 {
4009     if (InstallState::INSTALL_FAIL == state) {
4010         APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
4011         return;
4012     }
4013 
4014     auto infoItem = bundleInfos_.find(bundleName);
4015     if (infoItem == bundleInfos_.end()) {
4016         APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
4017         return;
4018     }
4019 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
4020     // remove external overlay bundle info and connection
4021     RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
4022 #endif
4023     APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
4024     const InnerBundleInfo &innerBundleInfo = infoItem->second;
4025     RecycleUidAndGid(innerBundleInfo);
4026     bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
4027     if (!ret) {
4028         APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
4029     }
4030     bundleInfos_.erase(bundleName);
4031     std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
4032     if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
4033         appServiceHspBundleName_.erase(bundleName);
4034     }
4035     DeleteDesktopShortcutInfo(bundleName);
4036 }
4037 
IsAppOrAbilityInstalled(const std::string & bundleName) const4038 bool BundleDataMgr::IsAppOrAbilityInstalled(const std::string &bundleName) const
4039 {
4040     if (bundleName.empty()) {
4041         APP_LOGW("IsAppOrAbilityInstalled bundleName empty");
4042         return false;
4043     }
4044 
4045     std::lock_guard<std::mutex> lock(stateMutex_);
4046     auto statusItem = installStates_.find(bundleName);
4047     if (statusItem == installStates_.end()) {
4048         APP_LOGW("name:%{public}s not find", bundleName.c_str());
4049         return false;
4050     }
4051 
4052     if (statusItem->second == InstallState::INSTALL_SUCCESS) {
4053         return true;
4054     }
4055 
4056     APP_LOGW("name:%{public}s not install success", bundleName.c_str());
4057     return false;
4058 }
4059 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,int32_t userId,int32_t appIndex) const4060 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4061     const int32_t flags, int32_t userId, int32_t appIndex) const
4062 {
4063     if (bundleName.empty()) {
4064         return false;
4065     }
4066     int32_t requestUserId = GetUserId(userId);
4067     if (requestUserId == Constants::INVALID_USERID) {
4068         return false;
4069     }
4070 
4071     if (bundleInfos_.empty()) {
4072         APP_LOGW("bundleInfos_ data is empty");
4073         return false;
4074     }
4075     APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
4076     auto item = bundleInfos_.find(bundleName);
4077     if (item == bundleInfos_.end()) {
4078         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4079             bundleName.c_str(), userId, appIndex, flags);
4080         return false;
4081     }
4082     const InnerBundleInfo &innerBundleInfo = item->second;
4083     if (innerBundleInfo.IsDisabled()) {
4084         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4085             bundleName.c_str(), userId, appIndex, flags);
4086         return false;
4087     }
4088 
4089     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4090     if (appIndex == 0) {
4091         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
4092             && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
4093             APP_LOGD("bundleName: %{public}s userId: %{public}d incorrect",
4094                 innerBundleInfo.GetBundleName().c_str(), requestUserId);
4095             return false;
4096         }
4097     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
4098         bool isEnabled = false;
4099         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4100         if (ret != ERR_OK) {
4101             APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d", ret);
4102             return false;
4103         }
4104         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
4105             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
4106                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
4107             return false;
4108         }
4109     } else {
4110         return false;
4111     }
4112     return true;
4113 }
4114 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4115 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4116     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4117 {
4118     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, userId, appIndex);
4119     if (!res) {
4120         APP_LOGW("get with flag failed");
4121         return false;
4122     }
4123     auto item = bundleInfos_.find(bundleName);
4124     if (item == bundleInfos_.end()) {
4125         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4126         return false;
4127     }
4128     info = item->second;
4129     return true;
4130 }
4131 
GetInnerBundleInfoWithBundleFlagsAndLock(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const4132 bool BundleDataMgr::GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName,
4133     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
4134 {
4135     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4136     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, info, userId);
4137     if (!res) {
4138         APP_LOGD("GetInnerBundleInfoWithBundleFlagsAndLock: bundleName %{public}s not find", bundleName.c_str());
4139         return res;
4140     }
4141     return true;
4142 }
4143 
GetInnerBundleInfoWithFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4144 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
4145     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4146 {
4147     int32_t requestUserId = GetUserId(userId);
4148     if (requestUserId == Constants::INVALID_USERID) {
4149         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4150     }
4151 
4152     if (bundleInfos_.empty()) {
4153         APP_LOGD("bundleInfos_ data is empty");
4154         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4155     }
4156     APP_LOGD(
4157         "GetInnerBundleInfoWithFlagsV9:bundleName:%{public}s,flags:%{public}d,userId:%{public}d,appIndex:%{public}d",
4158         bundleName.c_str(), flags, userId, appIndex);
4159     auto item = bundleInfos_.find(bundleName);
4160     if (item == bundleInfos_.end()) {
4161         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4162             bundleName.c_str(), userId, appIndex, flags);
4163         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4164     }
4165     const InnerBundleInfo &innerBundleInfo = item->second;
4166     if (innerBundleInfo.IsDisabled()) {
4167         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4168             bundleName.c_str(), userId, appIndex, flags);
4169         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4170     }
4171 
4172     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4173     bool isEnabled = false;
4174     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4175     if (ret != ERR_OK) {
4176         APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d -n %{public}s", ret, bundleName.c_str());
4177         return ret;
4178     }
4179     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
4180         && !isEnabled) {
4181         APP_LOGD("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4182         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4183     }
4184     info = innerBundleInfo;
4185     return ERR_OK;
4186 }
4187 
GetInnerBundleInfoWithBundleFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4188 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
4189     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4190 {
4191     if (bundleName.empty()) {
4192         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4193     }
4194     int32_t requestUserId = GetUserId(userId);
4195     if (requestUserId == Constants::INVALID_USERID) {
4196         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4197     }
4198 
4199     if (bundleInfos_.empty()) {
4200         APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
4201         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4202     }
4203     APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
4204     auto item = bundleInfos_.find(bundleName);
4205     if (item == bundleInfos_.end()) {
4206         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4207         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4208     }
4209     const InnerBundleInfo &innerBundleInfo = item->second;
4210     if (innerBundleInfo.IsDisabled()) {
4211         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
4212         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4213     }
4214 
4215     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4216     bool isEnabled = false;
4217     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4218     if (ret != ERR_OK) {
4219         return ret;
4220     }
4221     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
4222         && !isEnabled) {
4223         APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4224         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4225     }
4226     info = innerBundleInfo;
4227     return ERR_OK;
4228 }
4229 
GetInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)4230 bool BundleDataMgr::GetInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
4231 {
4232     APP_LOGD("GetInnerBundleInfo %{public}s", bundleName.c_str());
4233     if (bundleName.empty()) {
4234         APP_LOGW("bundleName is empty");
4235         return false;
4236     }
4237 
4238     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4239     auto infoItem = bundleInfos_.find(bundleName);
4240     if (infoItem == bundleInfos_.end()) {
4241         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4242         return false;
4243     }
4244     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4245     info = infoItem->second;
4246     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4247     return true;
4248 }
4249 
DisableBundle(const std::string & bundleName)4250 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
4251 {
4252     APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
4253     if (bundleName.empty()) {
4254         APP_LOGW("bundleName empty");
4255         return false;
4256     }
4257 
4258     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4259     auto infoItem = bundleInfos_.find(bundleName);
4260     if (infoItem == bundleInfos_.end()) {
4261         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4262         return false;
4263     }
4264     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4265     return true;
4266 }
4267 
EnableBundle(const std::string & bundleName)4268 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
4269 {
4270     APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
4271     if (bundleName.empty()) {
4272         APP_LOGW("bundleName empty");
4273         return false;
4274     }
4275 
4276     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4277     auto infoItem = bundleInfos_.find(bundleName);
4278     if (infoItem == bundleInfos_.end()) {
4279         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4280         return false;
4281     }
4282     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4283     return true;
4284 }
4285 
IsApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool & isEnabled,int32_t userId) const4286 ErrCode BundleDataMgr::IsApplicationEnabled(
4287     const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const
4288 {
4289     APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
4290     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4291     auto infoItem = bundleInfos_.find(bundleName);
4292     if (infoItem == bundleInfos_.end()) {
4293         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4294         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4295     }
4296     int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId(userId));
4297     if (appIndex == 0) {
4298         ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
4299         if (ret != ERR_OK) {
4300             APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
4301         }
4302         return ret;
4303     }
4304     const InnerBundleInfo &bundleInfo = infoItem->second;
4305     InnerBundleUserInfo innerBundleUserInfo;
4306     if (!bundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
4307         APP_LOGW("can not find userId %{public}d", responseUserId);
4308         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4309     }
4310     auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex));
4311     if (iter == innerBundleUserInfo.cloneInfos.end()) {
4312         APP_LOGW("can not find appIndex %{public}d", appIndex);
4313         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4314     }
4315     isEnabled = iter->second.enabled;
4316     return ERR_OK;
4317 }
4318 
SetApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool isEnable,const std::string & caller,int32_t userId)4319 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName,
4320     int32_t appIndex, bool isEnable, const std::string &caller, int32_t userId)
4321 {
4322     APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
4323     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4324     int32_t requestUserId = GetUserId(userId);
4325     if (requestUserId == Constants::INVALID_USERID) {
4326         APP_LOGW("Request userId %{public}d is invalid, bundleName:%{public}s", userId, bundleName.c_str());
4327         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4328     }
4329     auto infoItem = bundleInfos_.find(bundleName);
4330     if (infoItem == bundleInfos_.end()) {
4331         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4332         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4333     }
4334 
4335     InnerBundleInfo& newInfo = infoItem->second;
4336     if (appIndex != 0) {
4337         auto ret = newInfo.SetCloneApplicationEnabled(isEnable, appIndex, caller, requestUserId);
4338         if (ret != ERR_OK) {
4339             APP_LOGW("SetCloneApplicationEnabled for innerBundleInfo fail, errCode is %{public}d", ret);
4340             return ret;
4341         }
4342         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4343             APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", newInfo.GetBundleName().c_str());
4344             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4345         }
4346         return ERR_OK;
4347     }
4348     auto ret = newInfo.SetApplicationEnabled(isEnable, caller, requestUserId);
4349     if (ret != ERR_OK) {
4350         APP_LOGW("SetApplicationEnabled failed, err %{public}d", ret);
4351         return ret;
4352     }
4353 
4354     InnerBundleUserInfo innerBundleUserInfo;
4355     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4356         APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
4357         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4358     }
4359 
4360     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4361         bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
4362     } else {
4363         bundleStateStorage_->SaveBundleStateStorage(
4364             bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4365     }
4366     return ERR_OK;
4367 }
4368 
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)4369 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
4370 {
4371     if (bundleName.empty() || moduleName.empty()) {
4372         APP_LOGW("bundleName or moduleName is empty");
4373         return false;
4374     }
4375     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4376     if (userId == Constants::INVALID_USERID) {
4377         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4378         return false;
4379     }
4380     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4381         bundleName.c_str(), moduleName.c_str(), userId);
4382     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4383     auto infoItem = bundleInfos_.find(bundleName);
4384     if (infoItem == bundleInfos_.end()) {
4385         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4386         return false;
4387     }
4388     InnerBundleInfo newInfo = infoItem->second;
4389     bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
4390     if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
4391         ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
4392 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
4393         if (isEnable) {
4394             // call clean task
4395             APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
4396                 bundleName.c_str(), isEnable, ret);
4397             DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
4398                 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
4399         }
4400 #endif
4401         return ret;
4402     } else {
4403         APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
4404         return false;
4405     }
4406 }
4407 
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable) const4408 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
4409     bool &isRemovable) const
4410 {
4411     if (bundleName.empty() || moduleName.empty()) {
4412         APP_LOGW("bundleName or moduleName is empty");
4413         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4414     }
4415     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4416     if (userId == Constants::INVALID_USERID) {
4417         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4418         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4419     }
4420     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4421         bundleName.c_str(), moduleName.c_str(), userId);
4422     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4423     auto infoItem = bundleInfos_.find(bundleName);
4424     if (infoItem == bundleInfos_.end()) {
4425         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4426         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4427     }
4428     InnerBundleInfo newInfo = infoItem->second;
4429     return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
4430 }
4431 
IsAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool & isEnable) const4432 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const
4433 {
4434     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4435     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4436     if (infoItem == bundleInfos_.end()) {
4437         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4438         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4439     }
4440     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(abilityInfo.bundleName, Constants::ALL_USERID);
4441     if ((appIndex != 0) && (std::find(appIndexVec.begin(), appIndexVec.end(), appIndex) == appIndexVec.end())) {
4442         APP_LOGE("appIndex %{public}d is invalid", appIndex);
4443         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4444     }
4445     InnerBundleInfo innerBundleInfo = infoItem->second;
4446     auto ability = innerBundleInfo.FindAbilityInfoV9(
4447         abilityInfo.moduleName, abilityInfo.name);
4448     if (!ability) {
4449         APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
4450             abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
4451         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4452     }
4453     int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
4454     return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable, appIndex);
4455 }
4456 
SetAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool isEnabled,int32_t userId)4457 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex,
4458     bool isEnabled, int32_t userId)
4459 {
4460     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4461     int32_t requestUserId = GetUserId(userId);
4462     if (requestUserId == Constants::INVALID_USERID) {
4463         APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
4464             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4465         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4466     }
4467     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4468     if (infoItem == bundleInfos_.end()) {
4469         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4470         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4471     }
4472     InnerBundleInfo& newInfo = infoItem->second;
4473     if (appIndex != 0) {
4474         auto ret = newInfo.SetCloneAbilityEnabled(
4475             abilityInfo.moduleName, abilityInfo.name, isEnabled, userId, appIndex);
4476         if (ret != ERR_OK) {
4477             APP_LOGW("SetCloneAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4478                 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4479             return ret;
4480         }
4481         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4482             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", newInfo.GetBundleName().c_str());
4483             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4484         }
4485         return ERR_OK;
4486     }
4487     ErrCode ret = newInfo.SetAbilityEnabled(
4488         abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
4489     if (ret != ERR_OK) {
4490         APP_LOGW("SetAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4491             ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4492         return ret;
4493     }
4494     InnerBundleUserInfo innerBundleUserInfo;
4495     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4496         APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4497             requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4498         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4499     }
4500     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4501         bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
4502     } else {
4503         bundleStateStorage_->SaveBundleStateStorage(
4504             abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4505     }
4506     return ERR_OK;
4507 }
4508 
GetSandboxAppHelper() const4509 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
4510 {
4511     return sandboxAppHelper_;
4512 }
4513 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)4514 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4515 {
4516     APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4517     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4518     callbackList_.emplace_back(bundleStatusCallback);
4519     if (bundleStatusCallback->AsObject() != nullptr) {
4520         sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
4521             new (std::nothrow) BundleStatusCallbackDeathRecipient();
4522         if (deathRecipient == nullptr) {
4523             APP_LOGW("deathRecipient is null");
4524             return false;
4525         }
4526         bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
4527     }
4528     return true;
4529 }
4530 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)4531 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4532 {
4533     if (bundleEventCallback == nullptr) {
4534         APP_LOGW("bundleEventCallback is null");
4535         return false;
4536     }
4537     std::lock_guard lock(eventCallbackMutex_);
4538     if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
4539         APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
4540         return false;
4541     }
4542     if (bundleEventCallback->AsObject() != nullptr) {
4543         sptr<BundleEventCallbackDeathRecipient> deathRecipient =
4544             new (std::nothrow) BundleEventCallbackDeathRecipient();
4545         if (deathRecipient == nullptr) {
4546             APP_LOGW("deathRecipient is null");
4547             return false;
4548         }
4549         bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
4550     }
4551     eventCallbackList_.emplace_back(bundleEventCallback);
4552     return true;
4553 }
4554 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)4555 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4556 {
4557     APP_LOGD("begin to UnregisterBundleEventCallback");
4558     if (bundleEventCallback == nullptr) {
4559         APP_LOGW("bundleEventCallback is null");
4560         return false;
4561     }
4562     std::lock_guard lock(eventCallbackMutex_);
4563     eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
4564         [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
4565             return callback->AsObject() == bundleEventCallback->AsObject();
4566         }), eventCallbackList_.end());
4567     return true;
4568 }
4569 
NotifyBundleEventCallback(const EventFwk::CommonEventData & eventData) const4570 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
4571 {
4572     APP_LOGD("begin to NotifyBundleEventCallback");
4573     std::lock_guard lock(eventCallbackMutex_);
4574     for (const auto &callback : eventCallbackList_) {
4575         callback->OnReceiveEvent(eventData);
4576     }
4577     APP_LOGD("finish to NotifyBundleEventCallback");
4578 }
4579 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)4580 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4581 {
4582     APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4583     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4584     callbackList_.erase(std::remove_if(callbackList_.begin(),
4585         callbackList_.end(),
4586         [&](const sptr<IBundleStatusCallback> &callback) {
4587             return callback->AsObject() == bundleStatusCallback->AsObject();
4588         }),
4589         callbackList_.end());
4590     return true;
4591 }
4592 
UnregisterBundleStatusCallback()4593 bool BundleDataMgr::UnregisterBundleStatusCallback()
4594 {
4595     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4596     callbackList_.clear();
4597     return true;
4598 }
4599 
GenerateUidAndGid(InnerBundleUserInfo & innerBundleUserInfo)4600 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
4601 {
4602     if (innerBundleUserInfo.bundleName.empty()) {
4603         APP_LOGW("bundleName is null");
4604         return false;
4605     }
4606 
4607     int32_t bundleId = INVALID_BUNDLEID;
4608     if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
4609         APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
4610         return false;
4611     }
4612 
4613     innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
4614         + bundleId % Constants::BASE_USER_RANGE;
4615     innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
4616     return true;
4617 }
4618 
GenerateBundleId(const std::string & bundleName,int32_t & bundleId)4619 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
4620 {
4621     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4622     if (bundleIdMap_.empty()) {
4623         APP_LOGD("first app install");
4624         bundleId = baseAppUid_;
4625         bundleIdMap_.emplace(bundleId, bundleName);
4626         return true;
4627     }
4628 
4629     for (const auto &innerBundleId : bundleIdMap_) {
4630         if (innerBundleId.second == bundleName) {
4631             bundleId = innerBundleId.first;
4632             return true;
4633         }
4634     }
4635 
4636     for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
4637         if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
4638             APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
4639             bundleId = i;
4640             bundleIdMap_.emplace(bundleId, bundleName);
4641             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4642             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4643             return true;
4644         }
4645     }
4646 
4647     if (bundleIdMap_.rbegin()->first == MAX_APP_UID) {
4648         APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
4649         return false;
4650     }
4651 
4652     bundleId = bundleIdMap_.rbegin()->first + 1;
4653     bundleIdMap_.emplace(bundleId, bundleName);
4654     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4655     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4656     return true;
4657 }
4658 
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,const int32_t upgradeFlag)4659 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
4660     const std::string &moduleName, const int32_t upgradeFlag)
4661 {
4662     APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
4663     if (bundleName.empty() || moduleName.empty()) {
4664         APP_LOGW("bundleName or moduleName is empty");
4665         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4666     }
4667     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4668     auto infoItem = bundleInfos_.find(bundleName);
4669     if (infoItem == bundleInfos_.end()) {
4670         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4671     }
4672     InnerBundleInfo &newInfo = infoItem->second;
4673     ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
4674     if (setFlag == ERR_OK) {
4675         if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
4676             return ERR_OK;
4677         }
4678         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
4679     }
4680     APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
4681     return setFlag;
4682 }
4683 
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName) const4684 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
4685 {
4686     APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
4687     if (bundleName.empty() || moduleName.empty()) {
4688         APP_LOGW("bundleName or moduleName is empty");
4689         return false;
4690     }
4691     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4692     auto infoItem = bundleInfos_.find(bundleName);
4693     if (infoItem == bundleInfos_.end()) {
4694         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4695         return false;
4696     }
4697     InnerBundleInfo newInfo = infoItem->second;
4698     return newInfo.GetModuleUpgradeFlag(moduleName);
4699 }
4700 
RecycleUidAndGid(const InnerBundleInfo & info)4701 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
4702 {
4703     auto userInfos = info.GetInnerBundleUserInfos();
4704     if (userInfos.empty()) {
4705         APP_LOGE("user infos is empty");
4706         return;
4707     }
4708 
4709     auto innerBundleUserInfo = userInfos.begin()->second;
4710     int32_t bundleId = innerBundleUserInfo.uid -
4711         innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
4712     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4713     auto infoItem = bundleIdMap_.find(bundleId);
4714     if (infoItem == bundleIdMap_.end()) {
4715         return;
4716     }
4717 
4718     bundleIdMap_.erase(bundleId);
4719     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH);
4720     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::SHAREFS_CONFIG_PATH);
4721 }
4722 
RestoreUidAndGid()4723 bool BundleDataMgr::RestoreUidAndGid()
4724 {
4725     for (const auto &info : bundleInfos_) {
4726         bool onlyInsertOne = false;
4727         for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
4728             auto innerBundleUserInfo = infoItem.second;
4729             AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
4730             if (!onlyInsertOne) {
4731                 onlyInsertOne = true;
4732                 int32_t bundleId = innerBundleUserInfo.uid -
4733                     innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
4734                 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4735                 auto item = bundleIdMap_.find(bundleId);
4736                 if (item == bundleIdMap_.end()) {
4737                     bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
4738                 } else {
4739                     bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
4740                 }
4741                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4742                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId,
4743                     ServiceConstants::SHAREFS_CONFIG_PATH);
4744             }
4745             // appClone
4746             std::string bundleName = info.second.GetBundleName();
4747             std::map<std::string, InnerBundleCloneInfo> &clones = innerBundleUserInfo.cloneInfos;
4748             for (auto iter = clones.begin(); iter != clones.end(); iter++) {
4749                 auto &cloneInfo = iter->second;
4750                 int32_t bundleId = cloneInfo.uid - cloneInfo.userId * Constants::BASE_USER_RANGE;
4751                 std::string cloneBundleName =
4752                     BundleCloneCommonHelper::GetCloneBundleIdKey(bundleName, cloneInfo.appIndex);
4753                 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4754                 auto item = bundleIdMap_.find(bundleId);
4755                 if (item == bundleIdMap_.end()) {
4756                     bundleIdMap_.emplace(bundleId, cloneBundleName);
4757                 } else {
4758                     bundleIdMap_[bundleId] = cloneBundleName;
4759                 }
4760             }
4761         }
4762     }
4763     return true;
4764 }
4765 
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)4766 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
4767 {
4768     if (sandboxAppHelper_ != nullptr) {
4769         std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4770         sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
4771     }
4772 }
4773 
GetBundleMutex(const std::string & bundleName)4774 std::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
4775 {
4776     bundleMutex_.lock_shared();
4777     auto it = bundleMutexMap_.find(bundleName);
4778     if (it == bundleMutexMap_.end()) {
4779         bundleMutex_.unlock_shared();
4780         std::unique_lock lock {bundleMutex_};
4781         return bundleMutexMap_[bundleName];
4782     }
4783     bundleMutex_.unlock_shared();
4784     return it->second;
4785 }
4786 
GetProvisionId(const std::string & bundleName,std::string & provisionId) const4787 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
4788 {
4789     APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
4790     if (bundleName.empty()) {
4791         APP_LOGW("bundleName empty");
4792         return false;
4793     }
4794     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4795     auto infoItem = bundleInfos_.find(bundleName);
4796     if (infoItem == bundleInfos_.end()) {
4797         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4798         return false;
4799     }
4800     provisionId = infoItem->second.GetProvisionId();
4801     return true;
4802 }
4803 
GetAppFeature(const std::string & bundleName,std::string & appFeature) const4804 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
4805 {
4806     APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
4807     if (bundleName.empty()) {
4808         APP_LOGW("bundleName empty");
4809         return false;
4810     }
4811     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4812     auto infoItem = bundleInfos_.find(bundleName);
4813     if (infoItem == bundleInfos_.end()) {
4814         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4815         return false;
4816     }
4817     appFeature = infoItem->second.GetAppFeature();
4818     return true;
4819 }
4820 
SetInitialUserFlag(bool flag)4821 void BundleDataMgr::SetInitialUserFlag(bool flag)
4822 {
4823     APP_LOGD("SetInitialUserFlag %{public}d", flag);
4824     if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
4825         bundlePromise_->NotifyAllTasksExecuteFinished();
4826     }
4827 
4828     initialUserFlag_ = flag;
4829 }
4830 
GetDataStorage() const4831 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
4832 {
4833     return dataStorage_;
4834 }
4835 
GetAllFormsInfo(std::vector<FormInfo> & formInfos) const4836 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
4837 {
4838     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4839     if (bundleInfos_.empty()) {
4840         APP_LOGW("bundleInfos_ data is empty");
4841         return false;
4842     }
4843     auto result = false;
4844     for (const auto &item : bundleInfos_) {
4845         if (item.second.IsDisabled()) {
4846             APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
4847             continue;
4848         }
4849         item.second.GetFormsInfoByApp(formInfos);
4850         result = true;
4851     }
4852     APP_LOGD("all the form infos find success");
4853     return result;
4854 }
4855 
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos) const4856 bool BundleDataMgr::GetFormsInfoByModule(
4857     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
4858 {
4859     if (bundleName.empty()) {
4860         APP_LOGW("bundle name is empty");
4861         return false;
4862     }
4863     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4864     if (bundleInfos_.empty()) {
4865         APP_LOGW("bundleInfos_ data is empty");
4866         return false;
4867     }
4868     auto infoItem = bundleInfos_.find(bundleName);
4869     if (infoItem == bundleInfos_.end()) {
4870         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
4871         return false;
4872     }
4873     if (infoItem->second.IsDisabled()) {
4874         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
4875         return false;
4876     }
4877     infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
4878     if (formInfos.empty()) {
4879         return false;
4880     }
4881     APP_LOGD("module forminfo find success");
4882     return true;
4883 }
4884 
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos) const4885 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
4886 {
4887     if (bundleName.empty()) {
4888         APP_LOGW("bundle name is empty");
4889         return false;
4890     }
4891     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4892     if (bundleInfos_.empty()) {
4893         APP_LOGW("bundleInfos_ data is empty");
4894         return false;
4895     }
4896     auto infoItem = bundleInfos_.find(bundleName);
4897     if (infoItem == bundleInfos_.end()) {
4898         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
4899         return false;
4900     }
4901     if (infoItem->second.IsDisabled()) {
4902         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
4903         return false;
4904     }
4905     infoItem->second.GetFormsInfoByApp(formInfos);
4906     APP_LOGD("App forminfo find success");
4907     return true;
4908 }
4909 
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const4910 bool BundleDataMgr::GetShortcutInfos(
4911     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
4912 {
4913     int32_t requestUserId = GetUserId(userId);
4914     if (requestUserId == Constants::INVALID_USERID) {
4915         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
4916         return false;
4917     }
4918 
4919     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4920     InnerBundleInfo innerBundleInfo;
4921     if (!GetInnerBundleInfoWithFlags(
4922         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
4923         APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
4924             bundleName.c_str(), requestUserId);
4925         return false;
4926     }
4927     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
4928     return true;
4929 }
4930 
TryGetRawDataByExtractor(const std::string & hapPath,const std::string & profileName,const AbilityInfo & abilityInfo) const4931 std::string BundleDataMgr::TryGetRawDataByExtractor(const std::string &hapPath, const std::string &profileName,
4932     const AbilityInfo &abilityInfo) const
4933 {
4934     std::string rawData;
4935     GetJsonProfileByExtractor(hapPath, profileName, rawData);
4936     if (rawData.empty()) { // if get failed ,try get from resmgr
4937         BundleMgrClient bundleMgrClient;
4938         std::vector<std::string> rawJson;
4939         if (!bundleMgrClient.GetResConfigFile(abilityInfo, META_DATA_SHORTCUTS_NAME, rawJson)) {
4940             APP_LOGD("GetResConfigFile return false");
4941             return "";
4942         }
4943         return rawJson.empty() ? "" : rawJson[0];
4944     }
4945     return rawData;
4946 }
4947 
GetShortcutInfosByInnerBundleInfo(const InnerBundleInfo & info,std::vector<ShortcutInfo> & shortcutInfos) const4948 bool BundleDataMgr::GetShortcutInfosByInnerBundleInfo(
4949     const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const
4950 {
4951     if (!info.GetIsNewVersion()) {
4952         info.GetShortcutInfos(shortcutInfos);
4953         return true;
4954     }
4955     AbilityInfo abilityInfo;
4956     info.GetMainAbilityInfo(abilityInfo);
4957     if (abilityInfo.hapPath.empty() || abilityInfo.metadata.size() <= 0) {
4958         return false;
4959     }
4960     std::string rawData;
4961     for (const auto &meta : abilityInfo.metadata) {
4962         if (meta.name.compare(META_DATA_SHORTCUTS_NAME) == 0) {
4963             std::string resName = meta.resource;
4964             std::string hapPath = abilityInfo.hapPath;
4965             size_t pos = resName.rfind(PROFILE_PREFIX);
4966             bool posValid = (pos != std::string::npos) && (pos != resName.length() - strlen(PROFILE_PREFIX));
4967             if (!posValid) {
4968                 APP_LOGE("resName invalid %{public}s", resName.c_str());
4969                 return false;
4970             }
4971             std::string profileName = PROFILE_PATH + resName.substr(pos + strlen(PROFILE_PREFIX)) + JSON_SUFFIX;
4972             rawData = TryGetRawDataByExtractor(hapPath, profileName, abilityInfo);
4973             break;
4974         }
4975     }
4976     if (rawData.empty()) {
4977         APP_LOGE("shortcutinfo is empty");
4978         return false;
4979     }
4980     nlohmann::json jsonObject = nlohmann::json::parse(rawData, nullptr, false);
4981     if (jsonObject.is_discarded()) {
4982         APP_LOGE("shortcuts json invalid");
4983         return false;
4984     }
4985     ShortcutJson shortcutJson = jsonObject.get<ShortcutJson>();
4986     for (const Shortcut &item : shortcutJson.shortcuts) {
4987         ShortcutInfo shortcutInfo;
4988         shortcutInfo.bundleName = abilityInfo.bundleName;
4989         shortcutInfo.moduleName = abilityInfo.moduleName;
4990         info.InnerProcessShortcut(item, shortcutInfo);
4991         shortcutInfo.sourceType = 1;
4992         APP_LOGI("shortcutInfo: -n %{public}s, id %{public}s, iconId %{public}d, labelId %{public}d",
4993             shortcutInfo.bundleName.c_str(), shortcutInfo.id.c_str(), shortcutInfo.iconId, shortcutInfo.labelId);
4994         shortcutInfos.emplace_back(shortcutInfo);
4995     }
4996     return true;
4997 }
4998 
GetShortcutInfoV9(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const4999 ErrCode BundleDataMgr::GetShortcutInfoV9(
5000     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5001 {
5002     int32_t requestUserId = GetUserId(userId);
5003     if (requestUserId == Constants::INVALID_USERID) {
5004         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5005         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5006     }
5007     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5008     InnerBundleInfo innerBundleInfo;
5009     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
5010         BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
5011     if (ret != ERR_OK) {
5012         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5013             bundleName.c_str(), requestUserId);
5014         return ret;
5015     }
5016 
5017     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5018     return ERR_OK;
5019 }
5020 
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos) const5021 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
5022     std::vector<CommonEventInfo> &commonEventInfos) const
5023 {
5024     if (eventKey.empty()) {
5025         APP_LOGW("event key is empty");
5026         return false;
5027     }
5028     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5029     if (bundleInfos_.empty()) {
5030         APP_LOGW("bundleInfos_ data is empty");
5031         return false;
5032     }
5033     for (const auto &item : bundleInfos_) {
5034         const InnerBundleInfo &info = item.second;
5035         if (info.IsDisabled()) {
5036             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
5037             continue;
5038         }
5039         info.GetCommonEvents(eventKey, commonEventInfos);
5040     }
5041     if (commonEventInfos.size() == 0) {
5042         APP_LOGW("commonEventInfos is empty");
5043         return false;
5044     }
5045     APP_LOGE("commonEventInfos find success");
5046     return true;
5047 }
5048 
SavePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5049 bool BundleDataMgr::SavePreInstallBundleInfo(
5050     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5051 {
5052     if (preInstallDataStorage_ == nullptr) {
5053         APP_LOGW("preInstallDataStorage_ is nullptr");
5054         return false;
5055     }
5056 
5057     if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5058         APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
5059         return true;
5060     }
5061 
5062     return false;
5063 }
5064 
DeletePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5065 bool BundleDataMgr::DeletePreInstallBundleInfo(
5066     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5067 {
5068     if (preInstallDataStorage_ == nullptr) {
5069         APP_LOGW("preInstallDataStorage_ is nullptr");
5070         return false;
5071     }
5072 
5073     if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5074         APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
5075         return true;
5076     }
5077 
5078     return false;
5079 }
5080 
GetPreInstallBundleInfo(const std::string & bundleName,PreInstallBundleInfo & preInstallBundleInfo)5081 bool BundleDataMgr::GetPreInstallBundleInfo(
5082     const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
5083 {
5084     if (bundleName.empty()) {
5085         APP_LOGW("bundleName is empty");
5086         return false;
5087     }
5088     if (preInstallDataStorage_ == nullptr) {
5089         return false;
5090     }
5091     if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
5092         APP_LOGW_NOFUNC("get preInstall bundleInfo failed -n: %{public}s", bundleName.c_str());
5093         return false;
5094     }
5095     return true;
5096 }
5097 
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> & preInstallBundleInfos)5098 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
5099 {
5100     if (preInstallDataStorage_ == nullptr) {
5101         APP_LOGW("preInstallDataStorage_ is nullptr");
5102         return false;
5103     }
5104 
5105     if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
5106         APP_LOGD("load all storage success");
5107         return true;
5108     }
5109 
5110     return false;
5111 }
5112 
SaveInnerBundleInfo(const InnerBundleInfo & info) const5113 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
5114 {
5115     APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
5116     if (dataStorage_->SaveStorageBundleInfo(info)) {
5117         APP_LOGD("save install InnerBundleInfo successfully");
5118         return true;
5119     }
5120     APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
5121     return false;
5122 }
5123 
GetInnerBundleUserInfoByUserId(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo) const5124 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
5125     int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
5126 {
5127     APP_LOGD("get user info start: bundleName: (%{public}s)  userId: (%{public}d) ",
5128         bundleName.c_str(), userId);
5129     int32_t requestUserId = GetUserId(userId);
5130     if (requestUserId == Constants::INVALID_USERID) {
5131         return false;
5132     }
5133 
5134     if (bundleName.empty()) {
5135         APP_LOGW("bundle name is empty");
5136         return false;
5137     }
5138 
5139     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5140     if (bundleInfos_.empty()) {
5141         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5142         return false;
5143     }
5144 
5145     auto infoItem = bundleInfos_.find(bundleName);
5146     if (infoItem == bundleInfos_.end()) {
5147         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5148         return false;
5149     }
5150 
5151     return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
5152 }
5153 
GetUserId(int32_t userId) const5154 int32_t BundleDataMgr::GetUserId(int32_t userId) const
5155 {
5156     if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
5157         return userId;
5158     }
5159 
5160     if (userId == Constants::UNSPECIFIED_USERID) {
5161         userId = GetUserIdByCallingUid();
5162     }
5163 
5164     if (!HasUserId(userId)) {
5165         APP_LOGD("user is not existed");
5166         userId = Constants::INVALID_USERID;
5167     }
5168 
5169     return userId;
5170 }
5171 
GetUserIdByUid(int32_t uid) const5172 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
5173 {
5174     return BundleUtil::GetUserIdByUid(uid);
5175 }
5176 
AddUserId(int32_t userId)5177 void BundleDataMgr::AddUserId(int32_t userId)
5178 {
5179     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5180     auto item = multiUserIdsSet_.find(userId);
5181     if (item != multiUserIdsSet_.end()) {
5182         return;
5183     }
5184 
5185     multiUserIdsSet_.insert(userId);
5186 }
5187 
RemoveUserId(int32_t userId)5188 void BundleDataMgr::RemoveUserId(int32_t userId)
5189 {
5190     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5191     auto item = multiUserIdsSet_.find(userId);
5192     if (item == multiUserIdsSet_.end()) {
5193         return;
5194     }
5195 
5196     multiUserIdsSet_.erase(item);
5197 }
5198 
HasUserId(int32_t userId) const5199 bool BundleDataMgr::HasUserId(int32_t userId) const
5200 {
5201     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5202     return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
5203 }
5204 
GetUserIdByCallingUid() const5205 int32_t BundleDataMgr::GetUserIdByCallingUid() const
5206 {
5207     return BundleUtil::GetUserIdByCallingUid();
5208 }
5209 
GetAllUser() const5210 std::set<int32_t> BundleDataMgr::GetAllUser() const
5211 {
5212     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5213     return multiUserIdsSet_;
5214 }
5215 
CreateAppInstallDir(int32_t userId)5216 void BundleDataMgr::CreateAppInstallDir(int32_t userId)
5217 {
5218     std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5219         ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5220     ErrCode ret = InstalldClient::GetInstance()->Mkdir(path,
5221         S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5222         Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5223     if (ret != ERR_OK) {
5224         APP_LOGE("create app install %{public}d failed", userId);
5225     }
5226 }
5227 
RemoveAppInstallDir(int32_t userId)5228 void BundleDataMgr::RemoveAppInstallDir(int32_t userId)
5229 {
5230     std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5231         ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5232     ErrCode ret = InstalldClient::GetInstance()->RemoveDir(path);
5233     if (ret != ERR_OK) {
5234         APP_LOGE("remove app install %{public}d failed", userId);
5235     }
5236 }
5237 
GetInnerBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos) const5238 bool BundleDataMgr::GetInnerBundleUserInfos(
5239     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
5240 {
5241     APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
5242     if (bundleName.empty()) {
5243         APP_LOGW("bundle name is empty");
5244         return false;
5245     }
5246 
5247     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5248     if (bundleInfos_.empty()) {
5249         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5250         return false;
5251     }
5252 
5253     auto infoItem = bundleInfos_.find(bundleName);
5254     if (infoItem == bundleInfos_.end()) {
5255         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
5256         return false;
5257     }
5258 
5259     for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
5260         innerBundleUserInfos.emplace_back(userInfo.second);
5261     }
5262 
5263     return !innerBundleUserInfos.empty();
5264 }
5265 
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)5266 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
5267 {
5268     APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5269     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5270     InnerBundleInfo info;
5271     if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
5272         return Constants::EMPTY_STRING;
5273     }
5274 
5275     return info.GetAppPrivilegeLevel();
5276 }
5277 
QueryExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5278 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
5279     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5280 {
5281     int32_t requestUserId = GetUserId(userId);
5282     if (requestUserId == Constants::INVALID_USERID) {
5283         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5284         return false;
5285     }
5286 
5287     ElementName element = want.GetElement();
5288     std::string bundleName = element.GetBundleName();
5289     std::string extensionName = element.GetAbilityName();
5290     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s extensionName:%{public}s",
5291         bundleName.c_str(), extensionName.c_str());
5292     // explicit query
5293     if (!bundleName.empty() && !extensionName.empty()) {
5294         ExtensionAbilityInfo info;
5295         bool ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
5296         if (!ret) {
5297             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension error -n %{public}s -e %{public}s -u %{public}d"
5298                 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5299             return false;
5300         }
5301         extensionInfos.emplace_back(info);
5302         return true;
5303     }
5304 
5305     bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
5306     if (!ret) {
5307         LOG_D(BMS_TAG_QUERY,
5308             "implicit queryExtension error action:%{public}s uri:%{private}s type:%{public}s"
5309             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5310             requestUserId);
5311         return false;
5312     }
5313     if (extensionInfos.size() == 0) {
5314         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5315             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5316             requestUserId);
5317         return false;
5318     }
5319     LOG_D(BMS_TAG_QUERY, "query extensionAbilityInfo successfully");
5320     return true;
5321 }
5322 
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5323 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
5324     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5325 {
5326     int32_t requestUserId = GetUserId(userId);
5327     if (requestUserId == Constants::INVALID_USERID) {
5328         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5329     }
5330 
5331     ElementName element = want.GetElement();
5332     std::string bundleName = element.GetBundleName();
5333     std::string extensionName = element.GetAbilityName();
5334     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
5335         bundleName.c_str(), extensionName.c_str());
5336     // explicit query
5337     if (!bundleName.empty() && !extensionName.empty()) {
5338         ExtensionAbilityInfo info;
5339         ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
5340         if (ret != ERR_OK) {
5341             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension V9 error -n %{public}s -e %{public}s -u %{public}d"
5342                 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5343             return ret;
5344         }
5345         extensionInfos.emplace_back(info);
5346         return ERR_OK;
5347     }
5348     ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5349     if (ret != ERR_OK) {
5350         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionInfosV9 error");
5351         return ret;
5352     }
5353     if (extensionInfos.empty()) {
5354         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5355             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5356             requestUserId);
5357         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5358     }
5359     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 success");
5360     return ERR_OK;
5361 }
5362 
QueryExtensionAbilityInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5363 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
5364     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5365 {
5366     int32_t requestUserId = GetUserId(userId);
5367     if (requestUserId == Constants::INVALID_USERID) {
5368         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5369         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5370     }
5371 
5372     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5373     ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
5374     if (ret != ERR_OK) {
5375         LOG_D(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
5376         return ret;
5377     }
5378     if (extensionInfos.empty()) {
5379         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5380         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5381     }
5382     LOG_D(BMS_TAG_QUERY, "success");
5383     return ERR_OK;
5384 }
5385 
QueryExtensionAbilityInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5386 ErrCode BundleDataMgr::QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName,
5387     uint32_t flags, int32_t userId,
5388     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5389 {
5390     LOG_I(BMS_TAG_QUERY, "query failed %{public}s %{public}d", typeName.c_str(), userId);
5391     int32_t requestUserId = GetUserId(userId);
5392     if (requestUserId == Constants::INVALID_USERID) {
5393         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5394     }
5395     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5396     ErrCode ret = ImplicitQueryAllExtensionInfos(
5397         flags, requestUserId, extensionInfos, appIndex, typeName);
5398     if (ret != ERR_OK) {
5399         LOG_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfos error");
5400         LOG_W(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
5401         return ret;
5402     }
5403     if (extensionInfos.empty()) {
5404         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5405         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5406     }
5407     LOG_D(BMS_TAG_QUERY, "success");
5408     return ERR_OK;
5409 }
5410 
GetOneExtensionInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5411 void BundleDataMgr::GetOneExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId,
5412     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5413 {
5414     auto extensionInfos = info.GetInnerExtensionInfos();
5415     for (const auto &extensionAbilityInfo : extensionInfos) {
5416         if (typeName != extensionAbilityInfo.second.extensionTypeName) {
5417             continue;
5418         }
5419         infos.emplace_back(extensionAbilityInfo.second);
5420         return;
5421     }
5422 }
5423 
ExplicitQueryExtensionInfo(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const5424 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
5425     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5426 {
5427     ElementName element = want.GetElement();
5428     std::string bundleName = element.GetBundleName();
5429     std::string moduleName = element.GetModuleName();
5430     std::string extensionName = element.GetAbilityName();
5431     int32_t requestUserId = GetUserId(userId);
5432     if (requestUserId == Constants::INVALID_USERID) {
5433         return false;
5434     }
5435     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5436     InnerBundleInfo innerBundleInfo;
5437     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
5438         LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5439         return false;
5440     }
5441     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5442         if (sandboxAppHelper_ == nullptr) {
5443             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5444             return false;
5445         }
5446         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5447         if (ret != ERR_OK) {
5448             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5449             return false;
5450         }
5451     }
5452     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5453         bool res = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5454         if (!res) {
5455             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5456             return false;
5457         }
5458     }
5459     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5460     if (!extension) {
5461         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5462         return false;
5463     }
5464     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
5465         extension->permissions.clear();
5466     }
5467     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
5468         extension->metadata.clear();
5469     }
5470     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
5471         extension->skills.clear();
5472     }
5473     extensionInfo = (*extension);
5474     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
5475         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5476         innerBundleInfo.GetApplicationInfo(ApplicationFlag::GET_BASIC_APPLICATION_INFO |
5477             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
5478             extensionInfo.applicationInfo, appIndex);
5479     }
5480     // set uid for NAPI cache use
5481     InnerBundleUserInfo innerBundleUserInfo;
5482     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5483         extensionInfo.uid = innerBundleUserInfo.uid;
5484         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5485             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5486             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5487                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5488                 extensionInfo.uid = cloneInfo.uid;
5489             }
5490         }
5491     }
5492     extensionInfo.appIndex = appIndex;
5493     return true;
5494 }
5495 
ExplicitQueryExtensionInfoV9(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const5496 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
5497     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5498 {
5499     ElementName element = want.GetElement();
5500     std::string bundleName = element.GetBundleName();
5501     std::string moduleName = element.GetModuleName();
5502     std::string extensionName = element.GetAbilityName();
5503     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
5504         bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
5505     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d, appIndex:%{public}d",
5506         flags, userId, appIndex);
5507     int32_t requestUserId = GetUserId(userId);
5508     if (requestUserId == Constants::INVALID_USERID) {
5509         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5510     }
5511     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5512     InnerBundleInfo innerBundleInfo;
5513     if (appIndex == 0) {
5514         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
5515         if (ret != ERR_OK) {
5516             LOG_D(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5517             return ret;
5518         }
5519     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5520         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5521         if (ret != ERR_OK) {
5522             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5523             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5524         }
5525     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5526         if (sandboxAppHelper_ == nullptr) {
5527             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5528             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5529         }
5530         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5531         if (ret != ERR_OK) {
5532             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5533             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5534         }
5535     }
5536     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5537     if (!extension) {
5538         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5539         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5540     }
5541     if ((static_cast<uint32_t>(flags) &
5542         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
5543         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
5544         extension->permissions.clear();
5545     }
5546     if ((static_cast<uint32_t>(flags) &
5547         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
5548         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
5549         extension->metadata.clear();
5550     }
5551     if ((static_cast<uint32_t>(flags) &
5552         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
5553         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
5554         extension->skills.clear();
5555     }
5556     extensionInfo = (*extension);
5557     if ((static_cast<uint32_t>(flags) &
5558         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5559         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5560         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5561         innerBundleInfo.GetApplicationInfoV9(
5562             static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
5563             responseUserId, extensionInfo.applicationInfo, appIndex);
5564     }
5565     // set uid for NAPI cache use
5566     InnerBundleUserInfo innerBundleUserInfo;
5567     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5568         extensionInfo.uid = innerBundleUserInfo.uid;
5569         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5570             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5571             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5572                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5573                 extensionInfo.uid = cloneInfo.uid;
5574             }
5575         }
5576     }
5577     extensionInfo.appIndex = appIndex;
5578     return ERR_OK;
5579 }
5580 
FilterExtensionAbilityInfosByModuleName(const std::string & moduleName,std::vector<ExtensionAbilityInfo> & extensionInfos) const5581 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
5582     std::vector<ExtensionAbilityInfo> &extensionInfos) const
5583 {
5584     LOG_D(BMS_TAG_QUERY, "FilterExtensionAbilityInfos moduleName: %{public}s", moduleName.c_str());
5585     if (moduleName.empty()) {
5586         return;
5587     }
5588     for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
5589         if (iter->moduleName != moduleName) {
5590             iter = extensionInfos.erase(iter);
5591         } else {
5592             ++iter;
5593         }
5594     }
5595 }
5596 
ImplicitQueryExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5597 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5598     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5599 {
5600     if (want.GetAction().empty() && want.GetEntities().empty()
5601         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
5602         LOG_W(BMS_TAG_QUERY, "param invalid");
5603         return false;
5604     }
5605     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
5606         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
5607     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
5608 
5609     int32_t requestUserId = GetUserId(userId);
5610     if (requestUserId == Constants::INVALID_USERID) {
5611         return false;
5612     }
5613     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5614     std::string bundleName = want.GetElement().GetBundleName();
5615     if (!bundleName.empty()) {
5616         // query in current bundle
5617         if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
5618             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtension failed, bundleName:%{public}s",
5619                 bundleName.c_str());
5620             return false;
5621         }
5622     } else {
5623         // query all
5624         ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
5625     }
5626     // sort by priority, descending order.
5627     if (extensionInfos.size() > 1) {
5628         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
5629             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
5630     }
5631     return true;
5632 }
5633 
ImplicitQueryExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5634 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5635     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5636 {
5637     if (want.GetAction().empty() && want.GetEntities().empty()
5638         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
5639         LOG_W(BMS_TAG_QUERY, "param invalid");
5640         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5641     }
5642     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
5643         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
5644     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
5645 
5646     int32_t requestUserId = GetUserId(userId);
5647     if (requestUserId == Constants::INVALID_USERID) {
5648         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5649     }
5650     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5651     std::string bundleName = want.GetElement().GetBundleName();
5652     if (!bundleName.empty()) {
5653         // query in current bundle
5654         ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5655         if (ret != ERR_OK) {
5656             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s",
5657                 bundleName.c_str());
5658             return ret;
5659         }
5660     } else {
5661         // query all
5662         ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5663     }
5664     // sort by priority, descending order.
5665     if (extensionInfos.size() > 1) {
5666         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
5667             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
5668     }
5669     return ERR_OK;
5670 }
5671 
ImplicitQueryCurExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5672 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5673     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5674 {
5675     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfos");
5676     std::string bundleName = want.GetElement().GetBundleName();
5677     InnerBundleInfo innerBundleInfo;
5678     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
5679         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
5680             bundleName.c_str());
5681         return false;
5682     }
5683     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5684         if (sandboxAppHelper_ == nullptr) {
5685             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5686             return false;
5687         }
5688         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
5689         if (ret != ERR_OK) {
5690             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5691             return false;
5692         }
5693     }
5694     if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5695         bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex);
5696         if (!ret) {
5697             LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed errCode %{public}d", ret);
5698             return false;
5699         }
5700     }
5701     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5702     GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5703     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
5704     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfos");
5705     return true;
5706 }
5707 
ImplicitQueryCurExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5708 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5709     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5710 {
5711     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfosV9");
5712     std::string bundleName = want.GetElement().GetBundleName();
5713     InnerBundleInfo innerBundleInfo;
5714     if (appIndex == 0) {
5715         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
5716         if (ret != ERR_OK) {
5717             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5718                 bundleName.c_str());
5719             return ret;
5720         }
5721     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5722         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
5723         if (ret != ERR_OK) {
5724             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5725                 bundleName.c_str());
5726             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5727         }
5728     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5729         if (sandboxAppHelper_ == nullptr) {
5730             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5731             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5732         }
5733         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
5734         if (ret != ERR_OK) {
5735             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5736             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5737         }
5738     }
5739     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5740     GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5741     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
5742     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfosV9");
5743     return ERR_OK;
5744 }
5745 
ImplicitQueryAllExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5746 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5747     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5748 {
5749     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
5750     int32_t requestUserId = GetUserId(userId);
5751     if (requestUserId == Constants::INVALID_USERID) {
5752         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5753         return;
5754     }
5755 
5756     // query from bundleInfos_
5757     if (appIndex == 0) {
5758         for (const auto &item : bundleInfos_) {
5759             const InnerBundleInfo &innerBundleInfo = item.second;
5760             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5761             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
5762                 continue;
5763             }
5764             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
5765         }
5766     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5767         // query from sandbox manager for sandbox bundle
5768         if (sandboxAppHelper_ == nullptr) {
5769             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5770             return;
5771         }
5772         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
5773         for (const auto &item : sandboxMap) {
5774             InnerBundleInfo info;
5775             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
5776             if (pos == std::string::npos) {
5777                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
5778                 continue;
5779             }
5780             std::string innerBundleName = item.first.substr(pos + 1);
5781             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
5782                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
5783                 continue;
5784             }
5785 
5786             int32_t responseUserId = info.GetResponseUserId(userId);
5787             GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
5788         }
5789     } else if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5790         LOG_D(BMS_TAG_QUERY, "start to query extensionAbility in appClone");
5791         for (const auto &item : bundleInfos_) {
5792             int32_t responseUserId = item.second.GetResponseUserId(requestUserId);
5793             const InnerBundleInfo &innerBundleInfo = item.second;
5794             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
5795                 LOG_D(BMS_TAG_QUERY,
5796                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
5797                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
5798                 continue;
5799             }
5800             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5801         }
5802     }
5803     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
5804 }
5805 
ImplicitQueryAllExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5806 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
5807     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5808 {
5809     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfosV9");
5810     // query from bundleInfos_
5811     if (appIndex == 0) {
5812         for (const auto &item : bundleInfos_) {
5813             InnerBundleInfo innerBundleInfo;
5814             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId);
5815             if (ret != ERR_OK) {
5816                 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
5817                     item.first.c_str());
5818                 continue;
5819             }
5820             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5821             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
5822         }
5823     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5824         for (const auto &item : bundleInfos_) {
5825             const InnerBundleInfo &innerBundleInfo = item.second;
5826             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5827             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
5828                 LOG_D(BMS_TAG_QUERY,
5829                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
5830                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
5831                 continue;
5832             }
5833             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
5834         }
5835     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5836         // query from sandbox manager for sandbox bundle
5837         if (sandboxAppHelper_ == nullptr) {
5838             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5839             return;
5840         }
5841         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
5842         for (const auto &item : sandboxMap) {
5843             InnerBundleInfo info;
5844             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
5845             if (pos == std::string::npos) {
5846                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
5847                 continue;
5848             }
5849             std::string innerBundleName = item.first.substr(pos + 1);
5850             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
5851                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
5852                 continue;
5853             }
5854 
5855             int32_t responseUserId = info.GetResponseUserId(userId);
5856             GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
5857         }
5858     }
5859     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfosV9");
5860 }
5861 
GetExtensionAbilityInfoByTypeName(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,const std::string & typeName) const5862 void BundleDataMgr::GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId,
5863     std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const
5864 {
5865     for (const auto &item : bundleInfos_) {
5866         if ((flags &
5867                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
5868                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
5869             if (item.second.GetInnerExtensionInfos().empty() || !item.second.IsSystemApp()) {
5870                 continue;
5871             }
5872             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, userId);
5873             if (!ret) {
5874                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5875                     item.first.c_str());
5876                 continue;
5877             }
5878             int32_t responseUserId = item.second.GetResponseUserId(userId);
5879             GetOneExtensionInfosByExtensionTypeName(typeName, flags, responseUserId, item.second, infos);
5880             if (infos.size() > 0) {
5881                 return;
5882             }
5883         } else {
5884             InnerBundleInfo innerBundleInfo;
5885             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId);
5886             if (!ret) {
5887                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5888                     item.first.c_str());
5889                 continue;
5890             }
5891             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5892             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
5893         }
5894     }
5895 }
5896 
ImplicitQueryAllExtensionInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex,const std::string & typeName) const5897 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
5898     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const
5899 {
5900     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
5901     // query from bundleInfos_
5902     if (appIndex == 0) {
5903         GetExtensionAbilityInfoByTypeName(flags, userId, infos, typeName);
5904     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5905         // query from sandbox manager for sandbox bundle
5906         if (sandboxAppHelper_ == nullptr) {
5907             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5908             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5909         }
5910         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
5911         for (const auto &item : sandboxMap) {
5912             InnerBundleInfo info;
5913             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
5914             if (pos == std::string::npos) {
5915                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
5916                 continue;
5917             }
5918             std::string innerBundleName = item.first.substr(pos + 1);
5919             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
5920                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
5921                 continue;
5922             }
5923             int32_t responseUserId = info.GetResponseUserId(userId);
5924             GetAllExtensionInfos(flags, responseUserId, info, infos, appIndex);
5925         }
5926     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5927         for (const auto &item : bundleInfos_) {
5928             InnerBundleInfo innerBundleInfo;
5929             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId, appIndex);
5930             if (!ret) {
5931                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
5932                     item.first.c_str());
5933                 continue;
5934             }
5935             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
5936             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos, appIndex);
5937         }
5938     }
5939     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
5940     return ERR_OK;
5941 }
5942 
GetMatchExtensionInfos(const Want & want,int32_t flags,const int32_t & userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5943 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
5944     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5945 {
5946     auto extensionSkillInfos = info.GetExtensionSkillInfos();
5947     auto extensionInfos = info.GetInnerExtensionInfos();
5948     for (const auto &skillInfos : extensionSkillInfos) {
5949         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
5950             const Skill &skill = skillInfos.second[skillIndex];
5951             size_t matchUriIndex = 0;
5952             if (!skill.Match(want, matchUriIndex)) {
5953                 continue;
5954             }
5955             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
5956                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
5957                     skillInfos.first.c_str());
5958                 break;
5959             }
5960             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
5961             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_APPLICATION) ==
5962                 GET_EXTENSION_INFO_WITH_APPLICATION) {
5963                 info.GetApplicationInfo(
5964                     ApplicationFlag::GET_BASIC_APPLICATION_INFO |
5965                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
5966                     extensionInfo.applicationInfo);
5967             }
5968             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_PERMISSION) !=
5969                 GET_EXTENSION_INFO_WITH_PERMISSION) {
5970                 extensionInfo.permissions.clear();
5971             }
5972             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_METADATA) != GET_EXTENSION_INFO_WITH_METADATA) {
5973                 extensionInfo.metadata.clear();
5974             }
5975             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_SKILL) != GET_EXTENSION_INFO_WITH_SKILL) {
5976                 extensionInfo.skills.clear();
5977             }
5978             if ((static_cast<uint32_t>(flags) &
5979                 GET_EXTENSION_INFO_WITH_SKILL_URI) == GET_EXTENSION_INFO_WITH_SKILL_URI) {
5980                 AddSkillUrisInfo(skillInfos.second, extensionInfo.skillUri, skillIndex, matchUriIndex);
5981             }
5982             extensionInfo.appIndex = appIndex;
5983             infos.emplace_back(extensionInfo);
5984             break;
5985         }
5986     }
5987 }
5988 
EmplaceExtensionInfo(const InnerBundleInfo & info,const std::vector<Skill> & skills,ExtensionAbilityInfo & extensionInfo,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex,int32_t appIndex) const5989 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
5990     ExtensionAbilityInfo &extensionInfo, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos,
5991     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
5992 {
5993     if ((static_cast<uint32_t>(flags) &
5994         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5995         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5996         info.GetApplicationInfoV9(static_cast<int32_t>(
5997             GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
5998     }
5999     if ((static_cast<uint32_t>(flags) &
6000         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6001         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6002         extensionInfo.permissions.clear();
6003     }
6004     if ((static_cast<uint32_t>(flags) &
6005         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6006         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6007         extensionInfo.metadata.clear();
6008     }
6009     if ((static_cast<uint32_t>(flags) &
6010         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6011         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6012         extensionInfo.skills.clear();
6013     }
6014     if ((static_cast<uint32_t>(flags) &
6015         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) ==
6016         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) {
6017         AddSkillUrisInfo(skills, extensionInfo.skillUri, matchSkillIndex, matchUriIndex);
6018     }
6019     extensionInfo.appIndex = appIndex;
6020     infos.emplace_back(extensionInfo);
6021 }
6022 
GetMatchExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6023 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6024     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6025 {
6026     auto extensionSkillInfos = info.GetExtensionSkillInfos();
6027     auto extensionInfos = info.GetInnerExtensionInfos();
6028     for (const auto &skillInfos : extensionSkillInfos) {
6029         if (want.GetAction() == SHARE_ACTION) {
6030             if (!MatchShare(want, skillInfos.second)) {
6031                 continue;
6032             }
6033             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6034                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6035                     skillInfos.first.c_str());
6036                 continue;
6037             }
6038             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6039             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6040                 std::nullopt, std::nullopt, appIndex);
6041             continue;
6042         }
6043         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6044             const Skill &skill = skillInfos.second[skillIndex];
6045             size_t matchUriIndex = 0;
6046             if (!skill.Match(want, matchUriIndex)) {
6047                 continue;
6048             }
6049             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6050                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6051                     skillInfos.first.c_str());
6052                 break;
6053             }
6054             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6055             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6056                 skillIndex, matchUriIndex, appIndex);
6057             break;
6058         }
6059     }
6060 }
6061 
GetAllExtensionInfos(uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6062 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
6063     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6064 {
6065     auto extensionInfos = info.GetInnerExtensionInfos();
6066     for (const auto &extensionAbilityInfo : extensionInfos) {
6067         ExtensionAbilityInfo extensionInfo = extensionAbilityInfo.second;
6068         if ((flags &
6069             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6070             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6071             info.GetApplicationInfoV9(static_cast<int32_t>(
6072                 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6073         }
6074         if ((flags &
6075             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6076             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6077             extensionInfo.permissions.clear();
6078         }
6079         if ((flags &
6080             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6081             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6082             extensionInfo.metadata.clear();
6083         }
6084         if ((flags &
6085             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6086             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6087             extensionInfo.skills.clear();
6088         }
6089         extensionInfo.appIndex = appIndex;
6090         infos.emplace_back(extensionInfo);
6091     }
6092 }
6093 
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos) const6094 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
6095     std::vector<ExtensionAbilityInfo> &extensionInfos) const
6096 {
6097     int32_t requestUserId = GetUserId(userId);
6098     if (requestUserId == Constants::INVALID_USERID) {
6099         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", requestUserId);
6100         return false;
6101     }
6102     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6103     for (const auto &item : bundleInfos_) {
6104         const InnerBundleInfo &innerBundleInfo = item.second;
6105         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6106         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
6107             continue;
6108         }
6109         auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
6110         for (const auto &info : innerExtensionInfos) {
6111             if (info.second.type == extensionType) {
6112                 ExtensionAbilityInfo extensionAbilityInfo = info.second;
6113                 innerBundleInfo.GetApplicationInfo(
6114                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6115                     extensionAbilityInfo.applicationInfo);
6116                 extensionInfos.emplace_back(extensionAbilityInfo);
6117             }
6118         }
6119     }
6120     return true;
6121 }
6122 
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo) const6123 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
6124     ExtensionAbilityInfo &extensionAbilityInfo) const
6125 {
6126     int32_t requestUserId = GetUserId(userId);
6127     if (requestUserId == Constants::INVALID_USERID) {
6128         LOG_W(BMS_TAG_QUERY, "invalid userId -1");
6129         return false;
6130     }
6131     if (uri.empty()) {
6132         LOG_W(BMS_TAG_QUERY, "uri empty");
6133         return false;
6134     }
6135     std::string convertUri = uri;
6136     // example of valid param uri : fileShare:///com.example.FileShare/person/10
6137     // example of convertUri : fileShare://com.example.FileShare
6138     size_t schemePos = uri.find(PARAM_URI_SEPARATOR);
6139     if (schemePos != uri.npos) {
6140         // 1. cut string
6141         size_t cutPos = uri.find(ServiceConstants::PATH_SEPARATOR, schemePos + PARAM_URI_SEPARATOR_LEN);
6142         if (cutPos != uri.npos) {
6143             convertUri = uri.substr(0, cutPos);
6144         }
6145         // 2. replace :/// with ://
6146         convertUri.replace(schemePos, PARAM_URI_SEPARATOR_LEN, URI_SEPARATOR);
6147     } else {
6148         if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
6149             LOG_W(BMS_TAG_QUERY, "invalid uri : %{private}s", uri.c_str());
6150             return false;
6151         }
6152     }
6153     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6154     if (bundleInfos_.empty()) {
6155         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
6156         return false;
6157     }
6158     for (const auto &item : bundleInfos_) {
6159         const InnerBundleInfo &info = item.second;
6160         if (info.IsDisabled()) {
6161             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
6162             continue;
6163         }
6164 
6165         int32_t responseUserId = info.GetResponseUserId(requestUserId);
6166         if (!info.GetApplicationEnabled(responseUserId)) {
6167             continue;
6168         }
6169 
6170         bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
6171         if (!ret) {
6172             continue;
6173         }
6174         info.GetApplicationInfo(
6175             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6176             extensionAbilityInfo.applicationInfo);
6177         return true;
6178     }
6179     LOG_NOFUNC_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfoByUri (%{public}s) failed", convertUri.c_str());
6180     return false;
6181 }
6182 
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)6183 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
6184     uint32_t resId, int32_t userId, const std::string &localeInfo)
6185 {
6186     APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
6187 #ifdef GLOBAL_RESMGR_ENABLE
6188     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6189     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6190         GetResourceManager(bundleName, moduleName, userId);
6191     if (resourceManager == nullptr) {
6192         APP_LOGW("InitResourceManager failed");
6193         return Constants::EMPTY_STRING;
6194     }
6195     std::string label;
6196     OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
6197     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6198         APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6199         return Constants::EMPTY_STRING;
6200     }
6201     return label;
6202 #else
6203     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6204     return Constants::EMPTY_STRING;
6205 #endif
6206 }
6207 
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)6208 std::string BundleDataMgr::GetIconById(
6209     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
6210 {
6211     APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
6212         bundleName.c_str(), moduleName.c_str(), resId, density);
6213 #ifdef GLOBAL_RESMGR_ENABLE
6214     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6215     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6216         GetResourceManager(bundleName, moduleName, userId);
6217     if (resourceManager == nullptr) {
6218         APP_LOGW("InitResourceManager failed");
6219         return Constants::EMPTY_STRING;
6220     }
6221     std::string base64;
6222     OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
6223     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6224         APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6225         return Constants::EMPTY_STRING;
6226     }
6227     return base64;
6228 #else
6229     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6230     return Constants::EMPTY_STRING;
6231 #endif
6232 }
6233 
6234 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & bundleName,const std::string & moduleName,int32_t userId,const std::string & localeInfo) const6235 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
6236     const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
6237 {
6238     InnerBundleInfo innerBundleInfo;
6239     if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
6240         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6241         return nullptr;
6242     }
6243     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6244     BundleInfo bundleInfo;
6245     innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
6246     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
6247 
6248     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
6249     if (!resConfig) {
6250         APP_LOGE("resConfig is nullptr");
6251         return nullptr;
6252     }
6253 #ifdef GLOBAL_I18_ENABLE
6254     std::map<std::string, std::string> configs;
6255     OHOS::Global::I18n::LocaleInfo locale(
6256         localeInfo.empty() ? Global::I18n::LocaleConfig::GetSystemLocale() : localeInfo, configs);
6257     resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
6258 #endif
6259     resourceManager->UpdateResConfig(*resConfig);
6260 
6261     for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
6262         std::string moduleResPath;
6263         if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
6264             moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
6265         }
6266         if (!moduleResPath.empty()) {
6267             APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
6268             if (!resourceManager->AddResource(moduleResPath.c_str(), Global::Resource::SELECT_STRING
6269             | Global::Resource::SELECT_MEDIA)) {
6270                 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
6271             }
6272         }
6273     }
6274     return resourceManager;
6275 }
6276 #endif
6277 
GetAllPreInstallBundleInfos()6278 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
6279 {
6280     std::vector<PreInstallBundleInfo> preInstallBundleInfos;
6281     LoadAllPreInstallBundleInfos(preInstallBundleInfos);
6282     return preInstallBundleInfos;
6283 }
6284 
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo) const6285 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
6286     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
6287 {
6288     int32_t requestUserId = GetUserId(userId);
6289     if (requestUserId == Constants::INVALID_USERID) {
6290         APP_LOGW("invalid userId: %{public}d", userId);
6291         return false;
6292     }
6293     std::vector<AbilityInfo> abilityInfos;
6294     bool abilityValid =
6295         ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
6296     std::vector<ExtensionAbilityInfo> extensionInfos;
6297     bool extensionValid =
6298         ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
6299     if (!abilityValid && !extensionValid) {
6300         // both invalid
6301         APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
6302         return false;
6303     }
6304     if (abilityValid && extensionValid) {
6305         // both valid
6306         if (abilityInfos[0].priority >= extensionInfos[0].priority) {
6307             APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
6308             abilityInfo = abilityInfos[0];
6309         } else {
6310             APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
6311                 extensionInfos[0].name.c_str());
6312             extensionInfo = extensionInfos[0];
6313         }
6314     } else if (abilityValid) {
6315         // only ability valid
6316         APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
6317         abilityInfo = abilityInfos[0];
6318     } else {
6319         // only extension valid
6320         APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
6321         extensionInfo = extensionInfos[0];
6322     }
6323     return true;
6324 }
6325 
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos,bool & findDefaultApp)6326 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
6327     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
6328 {
6329     APP_LOGI("action:%{public}s uri:%{private}s type:%{public}s",
6330         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6331     APP_LOGI("flags:%{public}d userId:%{public}d withDefault(bool):%{public}d", flags, userId, withDefault);
6332 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
6333     // step1 : find default infos
6334     if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
6335         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6336         if (!abilityInfos.empty() || !extensionInfos.empty()) {
6337             APP_LOGI("find target default application");
6338             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6339                 findDefaultApp = true;
6340                 return true;
6341             }
6342             for (auto &info : abilityInfos) {
6343                 info.linkType = LinkType::DEFAULT_APP;
6344             }
6345         }
6346     }
6347     // step2 : find backup default infos
6348     if (withDefault &&
6349         DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
6350         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6351         if (!abilityInfos.empty() || !extensionInfos.empty()) {
6352             APP_LOGI("find target backup default application");
6353             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6354                 findDefaultApp = true;
6355                 return true;
6356             }
6357             for (auto &info : abilityInfos) {
6358                 info.linkType = LinkType::DEFAULT_APP;
6359             }
6360         }
6361     }
6362 #endif
6363     // step3 : implicit query infos
6364     bool abilityRet =
6365         ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
6366     APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
6367 
6368     bool extensionRet =
6369         ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
6370     APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
6371 
6372     ImplicitQueryCloneAbilityInfos(want, flags, userId, abilityInfos);
6373     return abilityRet || extensionRet || abilityInfos.size() > 0;
6374 }
6375 
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)6376 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
6377     std::vector<std::string> &dependentModuleNames)
6378 {
6379     APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
6380         bundleName.c_str(), moduleName.c_str());
6381     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6382     auto item = bundleInfos_.find(bundleName);
6383     if (item == bundleInfos_.end()) {
6384         APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
6385         return false;
6386     }
6387     const InnerBundleInfo &innerBundleInfo = item->second;
6388     return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
6389 }
6390 
UpdateRemovable(const std::string & bundleName,bool removable)6391 void BundleDataMgr::UpdateRemovable(
6392     const std::string &bundleName, bool removable)
6393 {
6394     APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
6395     if (bundleName.empty()) {
6396         APP_LOGW("bundleName is empty");
6397         return;
6398     }
6399 
6400     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6401     auto infoItem = bundleInfos_.find(bundleName);
6402     if (infoItem == bundleInfos_.end()) {
6403         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6404         return;
6405     }
6406 
6407     if (infoItem->second.IsRemovable() != removable) {
6408         infoItem->second.UpdateRemovable(true, removable);
6409         SaveInnerBundleInfo(infoItem->second);
6410     }
6411 }
6412 
UpdatePrivilegeCapability(const std::string & bundleName,const ApplicationInfo & appInfo)6413 void BundleDataMgr::UpdatePrivilegeCapability(
6414     const std::string &bundleName, const ApplicationInfo &appInfo)
6415 {
6416     APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
6417     if (bundleName.empty()) {
6418         APP_LOGW("bundleName is empty");
6419         return;
6420     }
6421 
6422     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6423     auto infoItem = bundleInfos_.find(bundleName);
6424     if (infoItem == bundleInfos_.end()) {
6425         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6426         return;
6427     }
6428 
6429     infoItem->second.UpdatePrivilegeCapability(appInfo);
6430 }
6431 
FetchInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)6432 bool BundleDataMgr::FetchInnerBundleInfo(
6433     const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
6434 {
6435     APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
6436     if (bundleName.empty()) {
6437         APP_LOGW("bundleName is empty");
6438         return false;
6439     }
6440 
6441     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6442     auto infoItem = bundleInfos_.find(bundleName);
6443     if (infoItem == bundleInfos_.end()) {
6444         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
6445         return false;
6446     }
6447 
6448     innerBundleInfo = infoItem->second;
6449     return true;
6450 }
6451 
6452 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId,const Element & element,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo,std::vector<Skill> & skills) const6453 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
6454     AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
6455 {
6456     APP_LOGD("begin to QueryInfoAndSkillsByElement");
6457     const std::string& bundleName = element.bundleName;
6458     const std::string& moduleName = element.moduleName;
6459     const std::string& abilityName = element.abilityName;
6460     const std::string& extensionName = element.extensionName;
6461     Want want;
6462     ElementName elementName("", bundleName, abilityName, moduleName);
6463     want.SetElement(elementName);
6464     bool isAbility = !element.abilityName.empty();
6465     bool ret = false;
6466     if (isAbility) {
6467         // get ability info
6468         ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6469         if (!ret) {
6470             APP_LOGD("ExplicitQueryAbilityInfo failed, abilityName:%{public}s", element.abilityName.c_str());
6471             return false;
6472         }
6473     } else {
6474         // get extension info
6475         elementName.SetAbilityName(extensionName);
6476         want.SetElement(elementName);
6477         ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6478         if (!ret) {
6479             APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
6480             return false;
6481         }
6482     }
6483 
6484     // get skills info
6485     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6486     if (bundleInfos_.empty()) {
6487         APP_LOGW("bundleInfos_ is empty");
6488         return false;
6489     }
6490     auto item = bundleInfos_.find(bundleName);
6491     if (item == bundleInfos_.end()) {
6492         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
6493         return false;
6494     }
6495     const InnerBundleInfo& innerBundleInfo = item->second;
6496     if (isAbility) {
6497         std::string key;
6498         key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
6499         APP_LOGD("begin to find ability skills, key : %{public}s", key.c_str());
6500         for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
6501             if (infoItem.first == key) {
6502                 skills = infoItem.second;
6503                 APP_LOGD("find ability skills success");
6504                 break;
6505             }
6506         }
6507     } else {
6508         std::string key;
6509         key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
6510         APP_LOGD("begin to find extension skills, key : %{public}s", key.c_str());
6511         for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
6512             if (infoItem.first == key) {
6513                 skills = infoItem.second;
6514                 APP_LOGD("find extension skills success");
6515                 break;
6516             }
6517         }
6518     }
6519     APP_LOGD("QueryInfoAndSkillsByElement success");
6520     return true;
6521 }
6522 
GetElement(int32_t userId,const ElementName & elementName,Element & element) const6523 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
6524 {
6525     APP_LOGD("begin to GetElement");
6526     const std::string& bundleName = elementName.GetBundleName();
6527     const std::string& moduleName = elementName.GetModuleName();
6528     const std::string& abilityName = elementName.GetAbilityName();
6529     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
6530         APP_LOGW("bundleName or moduleName or abilityName is empty");
6531         return false;
6532     }
6533     Want want;
6534     want.SetElement(elementName);
6535     AbilityInfo abilityInfo;
6536     bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6537     if (ret) {
6538         APP_LOGD("ElementName is ability");
6539         element.bundleName = bundleName;
6540         element.moduleName = moduleName;
6541         element.abilityName = abilityName;
6542         return true;
6543     }
6544 
6545     ExtensionAbilityInfo extensionInfo;
6546     ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6547     if (ret) {
6548         APP_LOGD("ElementName is extension");
6549         element.bundleName = bundleName;
6550         element.moduleName = moduleName;
6551         element.extensionName = abilityName;
6552         return true;
6553     }
6554 
6555     if (DelayedSingleton<BundleMgrService>::GetInstance()->IsBrokerServiceStarted()) {
6556         APP_LOGI("query ability from broker");
6557         AbilityInfo brokerAbilityInfo;
6558         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
6559         ErrCode resultCode = bmsExtensionClient->QueryAbilityInfo(want, 0, userId, brokerAbilityInfo, true);
6560         if (resultCode == ERR_OK) {
6561             APP_LOGI("ElementName is brokerAbility");
6562             element.bundleName = bundleName;
6563             element.moduleName = moduleName;
6564             element.abilityName = abilityName;
6565             return true;
6566         }
6567     }
6568 
6569     APP_LOGW("ElementName doesn't exist");
6570     return false;
6571 }
6572 #endif
6573 
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) const6574 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
6575     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
6576 {
6577     APP_LOGI("begin");
6578 #ifdef GLOBAL_RESMGR_ENABLE
6579     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6580     int32_t requestUserId = GetUserId(userId);
6581     if (requestUserId == Constants::INVALID_USERID) {
6582         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6583     }
6584     InnerBundleInfo innerBundleInfo;
6585     ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
6586         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
6587     if (errCode != ERR_OK) {
6588         return errCode;
6589     }
6590     AbilityInfo abilityInfo;
6591     errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
6592     if (errCode != ERR_OK) {
6593         return errCode;
6594     }
6595     bool isEnable = false;
6596     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6597     errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
6598     if (errCode != ERR_OK) {
6599         return errCode;
6600     }
6601     if (!isEnable) {
6602         APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
6603         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
6604     }
6605     std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
6606         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
6607     if (resourceManager == nullptr) {
6608         APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
6609         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6610     }
6611     OHOS::Global::Resource::RState ret =
6612         resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
6613     if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
6614         APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
6615         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6616     }
6617     return ERR_OK;
6618 #else
6619     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
6620 #endif
6621 }
6622 
GetStatusCallbackMutex()6623 std::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
6624 {
6625     return callbackMutex_;
6626 }
6627 
GetCallBackList() const6628 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
6629 {
6630     return callbackList_;
6631 }
6632 
UpdateQuickFixInnerBundleInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)6633 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
6634     const InnerBundleInfo &innerBundleInfo)
6635 {
6636     APP_LOGD("to update info:%{public}s", bundleName.c_str());
6637     if (bundleName.empty()) {
6638         APP_LOGW("update info fail, empty bundle name");
6639         return false;
6640     }
6641 
6642     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6643     auto infoItem = bundleInfos_.find(bundleName);
6644     if (infoItem == bundleInfos_.end()) {
6645         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
6646         return false;
6647     }
6648 
6649     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
6650         bundleInfos_.at(bundleName) = innerBundleInfo;
6651         return true;
6652     }
6653     APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
6654     return false;
6655 }
6656 
UpdateInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,bool needSaveStorage)6657 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo, bool needSaveStorage)
6658 {
6659     std::string bundleName = innerBundleInfo.GetBundleName();
6660     if (bundleName.empty()) {
6661         APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
6662         return false;
6663     }
6664     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
6665     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6666     auto infoItem = bundleInfos_.find(bundleName);
6667     if (infoItem == bundleInfos_.end()) {
6668         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
6669         return false;
6670     }
6671 
6672     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
6673         APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
6674         return false;
6675     }
6676     bundleInfos_.at(bundleName) = innerBundleInfo;
6677     return true;
6678 }
6679 
QueryOverlayInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)6680 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
6681 {
6682     APP_LOGD("start to query overlay innerBundleInfo");
6683     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6684     if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
6685         info = bundleInfos_.at(bundleName);
6686         return true;
6687     }
6688 
6689     APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6690     return false;
6691 }
6692 
SaveOverlayInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)6693 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
6694 {
6695     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6696     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
6697     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
6698         APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
6699         return;
6700     }
6701     bundleInfos_.at(bundleName) = innerBundleInfo;
6702 }
6703 
GetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)6704 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
6705     AppProvisionInfo &appProvisionInfo)
6706 {
6707     if (!HasUserId(userId)) {
6708         APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
6709         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6710     }
6711     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6712     auto infoItem = bundleInfos_.find(bundleName);
6713     if (infoItem == bundleInfos_.end()) {
6714         APP_LOGW_NOFUNC("-n %{public}s not exist", bundleName.c_str());
6715         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6716     }
6717     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
6718         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
6719         if (responseUserId == Constants::INVALID_USERID) {
6720             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6721         }
6722     }
6723     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
6724         APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
6725         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
6726     }
6727     return ERR_OK;
6728 }
6729 
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas) const6730 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
6731     std::vector<Metadata> &provisionMetadatas) const
6732 {
6733     // Reserved interface
6734     return ERR_OK;
6735 }
6736 
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles) const6737 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
6738 {
6739     APP_LOGD("GetAllSharedBundleInfo");
6740     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6741 
6742     for (const auto& [key, innerBundleInfo] : bundleInfos_) {
6743         if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
6744             continue;
6745         }
6746         SharedBundleInfo sharedBundleInfo;
6747         innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
6748         sharedBundles.emplace_back(sharedBundleInfo);
6749     }
6750 
6751     return ERR_OK;
6752 }
6753 
GetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)6754 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
6755     std::vector<SharedBundleInfo> &sharedBundles)
6756 {
6757     APP_LOGD("GetSharedBundleInfo");
6758     if (bundleName.empty() || moduleName.empty()) {
6759         APP_LOGW("bundleName or moduleName is empty");
6760         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
6761     }
6762 
6763     std::vector<Dependency> dependencies;
6764     ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
6765     if (errCode != ERR_OK) {
6766         APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
6767             errCode, bundleName.c_str());
6768         return errCode;
6769     }
6770 
6771     for (const auto& dep : dependencies) {
6772         SharedBundleInfo sharedBundleInfo;
6773         errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
6774         if (errCode != ERR_OK) {
6775             APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
6776                 errCode, bundleName.c_str());
6777             return errCode;
6778         }
6779         sharedBundles.emplace_back(sharedBundleInfo);
6780     }
6781 
6782     return ERR_OK;
6783 }
6784 
GetSharedBundleInfoBySelf(const std::string & bundleName,SharedBundleInfo & sharedBundleInfo)6785 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
6786 {
6787     APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
6788     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6789     auto infoItem = bundleInfos_.find(bundleName);
6790     if (infoItem == bundleInfos_.end()) {
6791         APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
6792             bundleName.c_str());
6793         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6794     }
6795     const InnerBundleInfo &innerBundleInfo = infoItem->second;
6796     if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
6797         APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
6798             bundleName.c_str());
6799         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6800     }
6801     innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
6802     APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
6803     return ERR_OK;
6804 }
6805 
GetSharedDependencies(const std::string & bundleName,const std::string & moduleName,std::vector<Dependency> & dependencies)6806 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
6807     std::vector<Dependency> &dependencies)
6808 {
6809     APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
6810         bundleName.c_str(), moduleName.c_str());
6811     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6812     auto item = bundleInfos_.find(bundleName);
6813     if (item == bundleInfos_.end()) {
6814         APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
6815         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6816     }
6817     const InnerBundleInfo &innerBundleInfo = item->second;
6818     if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
6819         APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
6820         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
6821     }
6822     APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
6823         bundleName.c_str(), moduleName.c_str());
6824     return ERR_OK;
6825 }
6826 
CheckHspVersionIsRelied(int32_t versionCode,const InnerBundleInfo & info) const6827 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
6828 {
6829     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6830     std::string hspBundleName = info.GetBundleName();
6831     if (versionCode == Constants::ALL_VERSIONCODE) {
6832         // uninstall hsp bundle, check other bundle denpendency
6833         return CheckHspBundleIsRelied(hspBundleName);
6834     }
6835     std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
6836     // check whether has higher version
6837     std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
6838     for (const auto &item : versionCodes) {
6839         if (item > static_cast<uint32_t>(versionCode)) {
6840             return false;
6841         }
6842     }
6843     // check other bundle denpendency
6844     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
6845         if (bundleName == hspBundleName) {
6846             continue;
6847         }
6848         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
6849         for (const auto &dependencyItem : dependencyList) {
6850             if (dependencyItem.bundleName == hspBundleName &&
6851                 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
6852                 return true;
6853             }
6854         }
6855     }
6856     return false;
6857 }
6858 
CheckHspBundleIsRelied(const std::string & hspBundleName) const6859 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
6860 {
6861     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
6862         if (bundleName == hspBundleName) {
6863             continue;
6864         }
6865         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
6866         for (const auto &dependencyItem : dependencyList) {
6867             if (dependencyItem.bundleName == hspBundleName) {
6868                 return true;
6869             }
6870         }
6871     }
6872     return false;
6873 }
6874 
GetSharedBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo)6875 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
6876 {
6877     if (bundleName.empty()) {
6878         APP_LOGW("bundleName is empty");
6879         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
6880     }
6881 
6882     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6883     auto infoItem = bundleInfos_.find(bundleName);
6884     if (infoItem == bundleInfos_.end()) {
6885         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6886         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
6887     }
6888     const InnerBundleInfo &innerBundleInfo = infoItem->second;
6889     innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
6890     return ERR_OK;
6891 }
6892 
IsPreInstallApp(const std::string & bundleName)6893 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
6894 {
6895     APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
6896     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6897     auto item = bundleInfos_.find(bundleName);
6898     if (item == bundleInfos_.end()) {
6899         APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
6900             bundleName.c_str());
6901         return false;
6902     }
6903     return item->second.IsPreInstallApp();
6904 }
6905 
GetProxyDataInfos(const std::string & bundleName,const std::string & moduleName,int32_t userId,std::vector<ProxyData> & proxyDatas) const6906 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
6907     int32_t userId, std::vector<ProxyData> &proxyDatas) const
6908 {
6909     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6910     InnerBundleInfo info;
6911     auto ret = GetInnerBundleInfoWithBundleFlagsV9(
6912         bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
6913     if (ret != ERR_OK) {
6914         APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
6915         return ret;
6916     }
6917     return info.GetProxyDataInfos(moduleName, proxyDatas);
6918 }
6919 
GetAllProxyDataInfos(int32_t userId,std::vector<ProxyData> & proxyDatas) const6920 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
6921 {
6922     std::vector<BundleInfo> bundleInfos;
6923     auto ret = GetBundleInfosV9(
6924         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
6925     if (ret != ERR_OK) {
6926         APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
6927         return ret;
6928     }
6929     for (const auto &bundleInfo : bundleInfos) {
6930         for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
6931             proxyDatas.insert(
6932                 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
6933         }
6934     }
6935     return ERR_OK;
6936 }
6937 
GetBundleNameByAppId(const std::string & appId) const6938 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
6939 {
6940     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6941     auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
6942         return appId == pair.second.GetAppId();
6943     });
6944     if (it == bundleInfos_.cend()) {
6945         APP_LOGW("invalid appId, can't find bundleName");
6946         return Constants::EMPTY_STRING;
6947     }
6948     return it->second.GetBundleName();
6949 }
6950 
SetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,AOTCompileStatus aotCompileStatus,uint32_t versionCode)6951 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
6952     AOTCompileStatus aotCompileStatus, uint32_t versionCode)
6953 {
6954     APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
6955         bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
6956     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6957     auto item = bundleInfos_.find(bundleName);
6958     if (item == bundleInfos_.end()) {
6959         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
6960         (void)InstalldClient::GetInstance()->RemoveDir(ServiceConstants::ARK_CACHE_PATH + bundleName);
6961         return;
6962     }
6963     if (item->second.GetVersionCode() != versionCode) {
6964         APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
6965             versionCode, item->second.GetVersionCode(), bundleName.c_str());
6966         return;
6967     }
6968     item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
6969     std::string abi;
6970     std::string path;
6971     if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
6972         abi = ServiceConstants::ARM64_V8A;
6973         path = ServiceConstants::ARM64 + ServiceConstants::PATH_SEPARATOR;
6974     }
6975     item->second.SetArkNativeFileAbi(abi);
6976     item->second.SetArkNativeFilePath(path);
6977     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
6978         APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
6979     }
6980 }
6981 
ResetAOTFlags()6982 void BundleDataMgr::ResetAOTFlags()
6983 {
6984     APP_LOGI("ResetAOTFlags begin");
6985     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6986     std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
6987         item.second.ResetAOTFlags();
6988         if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
6989             APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
6990         }
6991     });
6992     APP_LOGI("ResetAOTFlags end");
6993 }
6994 
ResetAOTFlagsCommand(const std::string & bundleName)6995 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
6996 {
6997     APP_LOGI("ResetAOTFlagsCommand begin");
6998     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6999     auto item = bundleInfos_.find(bundleName);
7000     if (item == bundleInfos_.end()) {
7001         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7002         return;
7003     }
7004     item->second.ResetAOTFlags();
7005     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7006         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7007         return;
7008     }
7009     APP_LOGI("ResetAOTFlagsCommand end");
7010 }
7011 
ResetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,int32_t triggerMode)7012 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7013     int32_t triggerMode)
7014 {
7015     APP_LOGI("ResetAOTCompileStatus begin");
7016     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7017     auto item = bundleInfos_.find(bundleName);
7018     if (item == bundleInfos_.end()) {
7019         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7020         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7021     }
7022     ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
7023     if (ret != ERR_OK) {
7024         return ret;
7025     }
7026     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7027         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7028         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7029     }
7030     APP_LOGI("ResetAOTCompileStatus end");
7031     return ERR_OK;
7032 }
7033 
GetAllBundleName() const7034 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
7035 {
7036     APP_LOGD("GetAllBundleName begin");
7037     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7038     std::vector<std::string> bundleNames;
7039     bundleNames.reserve(bundleInfos_.size());
7040     std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
7041         return item.first;
7042     });
7043     return bundleNames;
7044 }
7045 
QueryInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info) const7046 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
7047 {
7048     APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
7049     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7050     auto item = bundleInfos_.find(bundleName);
7051     if (item == bundleInfos_.end()) {
7052         APP_LOGW_NOFUNC("QueryInnerBundleInfo failed: %{public}s", bundleName.c_str());
7053         return false;
7054     }
7055     info = item->second;
7056     return true;
7057 }
7058 
GetUserIds(const std::string & bundleName) const7059 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
7060 {
7061     APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
7062     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7063     std::vector<int32_t> userIds;
7064     auto infoItem = bundleInfos_.find(bundleName);
7065     if (infoItem == bundleInfos_.end()) {
7066         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7067         return userIds;
7068     }
7069     auto userInfos = infoItem->second.GetInnerBundleUserInfos();
7070     std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
7071         return item.second.bundleUserInfo.userId;
7072     });
7073     return userIds;
7074 }
7075 
GetSpecifiedDistributionType(const std::string & bundleName,std::string & specifiedDistributionType)7076 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
7077     const std::string &bundleName, std::string &specifiedDistributionType)
7078 {
7079     APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
7080     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7081     auto infoItem = bundleInfos_.find(bundleName);
7082     if (infoItem == bundleInfos_.end()) {
7083         APP_LOGW_NOFUNC("-n %{public}s does not exist", bundleName.c_str());
7084         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7085     }
7086     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7087         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7088         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7089         if (responseUserId == Constants::INVALID_USERID) {
7090             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7091             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7092         }
7093     }
7094     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
7095         specifiedDistributionType)) {
7096         APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed", bundleName.c_str());
7097         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7098     }
7099     return ERR_OK;
7100 }
7101 
GetAdditionalInfo(const std::string & bundleName,std::string & additionalInfo)7102 ErrCode BundleDataMgr::GetAdditionalInfo(
7103     const std::string &bundleName, std::string &additionalInfo)
7104 {
7105     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
7106     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7107     auto infoItem = bundleInfos_.find(bundleName);
7108     if (infoItem == bundleInfos_.end()) {
7109         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
7110         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7111     }
7112     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7113         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7114         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7115         if (responseUserId == Constants::INVALID_USERID) {
7116             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7117             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7118         }
7119     }
7120     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
7121         additionalInfo)) {
7122         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
7123         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7124     }
7125     return ERR_OK;
7126 }
7127 
SetExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)7128 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7129     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7130 {
7131     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7132     auto item = bundleInfos_.find(bundleName);
7133     if (item == bundleInfos_.end()) {
7134         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7135         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7136     }
7137     ErrCode ret;
7138     if (!extName.empty()) {
7139         ret = item->second.SetExtName(moduleName, abilityName, extName);
7140         if (ret != ERR_OK) {
7141             APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7142             return ret;
7143         }
7144     }
7145     if (!mimeType.empty()) {
7146         ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
7147         if (ret != ERR_OK) {
7148             APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7149             return ret;
7150         }
7151     }
7152     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7153         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7154         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7155     }
7156     return ERR_OK;
7157 }
7158 
DelExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)7159 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7160     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7161 {
7162     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7163     auto item = bundleInfos_.find(bundleName);
7164     if (item == bundleInfos_.end()) {
7165         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7166         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7167     }
7168     ErrCode ret;
7169     if (!extName.empty()) {
7170         ret = item->second.DelExtName(moduleName, abilityName, extName);
7171         if (ret != ERR_OK) {
7172             APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7173             return ret;
7174         }
7175     }
7176     if (!mimeType.empty()) {
7177         ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
7178         if (ret != ERR_OK) {
7179             APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7180             return ret;
7181         }
7182     }
7183     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7184         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7185         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7186     }
7187     return ERR_OK;
7188 }
7189 
MatchPrivateType(const Want & want,const std::vector<std::string> & supportExtNames,const std::vector<std::string> & supportMimeTypes,const std::vector<std::string> & paramMimeTypes) const7190 bool BundleDataMgr::MatchPrivateType(const Want &want,
7191     const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes,
7192     const std::vector<std::string> &paramMimeTypes) const
7193 {
7194     std::string uri = want.GetUriString();
7195     APP_LOGD("MatchPrivateType, uri is %{private}s", uri.c_str());
7196     auto suffixIndex = uri.rfind('.');
7197     if (suffixIndex == std::string::npos) {
7198         return false;
7199     }
7200     std::string suffix = uri.substr(suffixIndex + 1);
7201     bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
7202         return extName == suffix;
7203     });
7204     if (supportPrivateType) {
7205         APP_LOGI("uri is a supported private-type file");
7206         return true;
7207     }
7208 
7209     if (!paramMimeTypes.empty()) {
7210         auto iter = std::find_first_of(
7211             paramMimeTypes.begin(), paramMimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
7212         if (iter != paramMimeTypes.end()) {
7213             APP_LOGI("uri is a supported mime-type file");
7214             return true;
7215         }
7216     }
7217     return false;
7218 }
7219 
QueryAppGalleryAbilityName(std::string & bundleName,std::string & abilityName)7220 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
7221 {
7222     APP_LOGD("QueryAppGalleryAbilityName called");
7223     AbilityInfo abilityInfo;
7224     ExtensionAbilityInfo extensionInfo;
7225     Want want;
7226     want.SetAction(FREE_INSTALL_ACTION);
7227     if (!ImplicitQueryInfoByPriority(
7228         want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
7229         APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
7230         return false;
7231     }
7232     if (!abilityInfo.name.empty()) {
7233         bundleName = abilityInfo.bundleName;
7234         abilityName = abilityInfo.name;
7235     } else {
7236         bundleName = extensionInfo.bundleName;
7237         abilityName = extensionInfo.name;
7238     }
7239 
7240     if (bundleName.empty() || abilityName.empty()) {
7241         APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
7242             bundleName.c_str(), abilityName.c_str());
7243         return false;
7244     }
7245     APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
7246         bundleName.c_str(), abilityName.c_str());
7247     return true;
7248 }
7249 
GetJsonProfile(ProfileType profileType,const std::string & bundleName,const std::string & moduleName,std::string & profile,int32_t userId) const7250 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
7251     const std::string &moduleName, std::string &profile, int32_t userId) const
7252 {
7253     APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
7254         profileType, bundleName.c_str(), moduleName.c_str());
7255     int32_t requestUserId = GetUserId(userId);
7256     if (requestUserId == Constants::INVALID_USERID) {
7257         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7258     }
7259     auto mapItem = PROFILE_TYPE_MAP.find(profileType);
7260     if (mapItem == PROFILE_TYPE_MAP.end()) {
7261         APP_LOGE("profileType: %{public}d is invalid", profileType);
7262         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7263     }
7264     std::string profilePath = mapItem->second;
7265     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7266     const auto &item = bundleInfos_.find(bundleName);
7267     if (item == bundleInfos_.end()) {
7268         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
7269         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7270     }
7271     const InnerBundleInfo &bundleInfo = item->second;
7272     bool isEnabled = false;
7273     int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
7274     ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
7275     if (res != ERR_OK) {
7276         APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
7277         return res;
7278     }
7279     if (!isEnabled) {
7280         APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
7281         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
7282     }
7283     std::string moduleNameTmp = moduleName;
7284     if (moduleName.empty()) {
7285         APP_LOGW("moduleName is empty, try to get profile from entry module");
7286         std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
7287         for (const auto &info : moduleInfos) {
7288             if (info.second.isEntry) {
7289                 moduleNameTmp = info.second.moduleName;
7290                 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
7291                 break;
7292             }
7293         }
7294     }
7295     auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
7296     if (!moduleInfo) {
7297         APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
7298         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7299     }
7300     return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
7301 }
7302 
GetJsonProfileByExtractor(const std::string & hapPath,const std::string & profilePath,std::string & profile) const7303 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
7304     const std::string &profilePath, std::string &profile) const
7305 {
7306     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
7307     APP_LOGD("GetJsonProfileByExtractor with hapPath %{private}s and profilePath %{private}s",
7308         hapPath.c_str(), profilePath.c_str());
7309     BundleExtractor bundleExtractor(hapPath);
7310     if (!bundleExtractor.Init()) {
7311         APP_LOGE("bundle extractor init failed");
7312         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7313     }
7314     if (!bundleExtractor.HasEntry(profilePath)) {
7315         APP_LOGE("profile not exist");
7316         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7317     }
7318     std::stringstream profileStream;
7319     if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
7320         APP_LOGE("extract profile failed");
7321         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7322     }
7323     profile = profileStream.str();
7324     return ERR_OK;
7325 }
7326 
QueryDataGroupInfos(const std::string & bundleName,int32_t userId,std::vector<DataGroupInfo> & infos) const7327 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
7328     std::vector<DataGroupInfo> &infos) const
7329 {
7330     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7331     auto infoItem = bundleInfos_.find(bundleName);
7332     if (infoItem == bundleInfos_.end()) {
7333         APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
7334         return false;
7335     }
7336     auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
7337     for (const auto &item : dataGroupInfos) {
7338         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
7339             [userId](const DataGroupInfo &info) {
7340             return info.userId == userId;
7341         });
7342         if (dataGroupIter != std::end(item.second)) {
7343             infos.push_back(*dataGroupIter);
7344         }
7345     }
7346     return true;
7347 }
7348 
GetGroupDir(const std::string & dataGroupId,std::string & dir,int32_t userId) const7349 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
7350 {
7351     if (userId == Constants::UNSPECIFIED_USERID) {
7352         userId = AccountHelper::GetCurrentActiveUserId();
7353     }
7354     std::string uuid;
7355     if (BundlePermissionMgr::IsSystemApp() &&
7356         BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
7357         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7358         for (const auto &item : bundleInfos_) {
7359             const auto &dataGroupInfos = item.second.GetDataGroupInfos();
7360             auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7361             if (dataGroupInfosIter == dataGroupInfos.end()) {
7362                 continue;
7363             }
7364             auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
7365                 std::end(dataGroupInfosIter->second),
7366                 [userId](const DataGroupInfo &info) { return info.userId == userId; });
7367             if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
7368                 uuid = dataInUserIter->uuid;
7369                 break;
7370             }
7371         }
7372     } else {
7373         int32_t callingUid = IPCSkeleton::GetCallingUid();
7374         InnerBundleInfo innerBundleInfo;
7375         if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
7376             APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
7377             return false;
7378         }
7379         const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
7380         auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7381         if (dataGroupInfosIter == dataGroupInfos.end()) {
7382             APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
7383             return false;
7384         }
7385         auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
7386             [userId](const DataGroupInfo &info) {
7387             return info.userId == userId;
7388         });
7389         if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
7390             uuid = dataGroupIter->uuid;
7391         }
7392     }
7393     if (uuid.empty()) {
7394         APP_LOGW("get uuid by data group id failed");
7395         return false;
7396     }
7397     dir = ServiceConstants::REAL_DATA_PATH + ServiceConstants::PATH_SEPARATOR + std::to_string(userId)
7398         + ServiceConstants::DATA_GROUP_PATH + uuid;
7399     APP_LOGD("groupDir: %{private}s", dir.c_str());
7400     return true;
7401 }
7402 
CreateNewDataGroupInfo(const std::string & groupId,const int32_t userId,const DataGroupInfo & oldDataGroupInfo,DataGroupInfo & newDataGroupInfo)7403 void BundleDataMgr::CreateNewDataGroupInfo(const std::string &groupId, const int32_t userId,
7404     const DataGroupInfo &oldDataGroupInfo, DataGroupInfo &newDataGroupInfo)
7405 {
7406     newDataGroupInfo.dataGroupId = groupId;
7407     newDataGroupInfo.userId = userId;
7408 
7409     newDataGroupInfo.uuid = oldDataGroupInfo.uuid;
7410     int32_t uniqueId = oldDataGroupInfo.uid - oldDataGroupInfo.userId * Constants::BASE_USER_RANGE -
7411         DATA_GROUP_UID_OFFSET;
7412     int32_t uid = uniqueId + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
7413     newDataGroupInfo.uid = uid;
7414     newDataGroupInfo.gid = uid;
7415 }
7416 
ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo & innerBundleInfo)7417 void BundleDataMgr::ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo &innerBundleInfo)
7418 {
7419     auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
7420     if (dataGroupInfos.empty()) {
7421         return;
7422     }
7423     for (int32_t userId : innerBundleInfo.GetUsers()) {
7424         for (const auto &dataItem : dataGroupInfos) {
7425             std::string groupId = dataItem.first;
7426             if (dataItem.second.empty()) {
7427                 APP_LOGW("id infos %{public}s empty in -n %{public}s", groupId.c_str(),
7428                     innerBundleInfo.GetBundleName().c_str());
7429                 continue;
7430             }
7431             DataGroupInfo dataGroupInfo;
7432             CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
7433             innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
7434             // user path can not access, need create group dir when user unlocked
7435         }
7436     }
7437 }
7438 
GenerateDataGroupUuidAndUid(DataGroupInfo & dataGroupInfo,int32_t userId,std::unordered_set<int32_t> & uniqueIdSet) const7439 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
7440     std::unordered_set<int32_t> &uniqueIdSet) const
7441 {
7442     int32_t uniqueId = DATA_GROUP_INDEX_START;
7443     for (int32_t i = DATA_GROUP_INDEX_START; i < DATA_GROUP_UID_OFFSET; i++) {
7444         if (uniqueIdSet.find(i) == uniqueIdSet.end()) {
7445             uniqueId = i;
7446             break;
7447         }
7448     }
7449 
7450     int32_t uid = userId * Constants::BASE_USER_RANGE + uniqueId + DATA_GROUP_UID_OFFSET;
7451     dataGroupInfo.uid = uid;
7452     dataGroupInfo.gid = uid;
7453 
7454     std::string str = BundleUtil::GenerateUuidByKey(dataGroupInfo.dataGroupId);
7455     dataGroupInfo.uuid = str;
7456     uniqueIdSet.insert(uniqueId);
7457 }
7458 
GenerateDataGroupInfos(const std::string & bundleName,const std::unordered_set<std::string> & dataGroupIdList,int32_t userId)7459 void BundleDataMgr::GenerateDataGroupInfos(const std::string &bundleName,
7460     const std::unordered_set<std::string> &dataGroupIdList, int32_t userId)
7461 {
7462     APP_LOGD("called for user: %{public}d", userId);
7463     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7464     auto bundleInfoItem = bundleInfos_.find(bundleName);
7465     if (bundleInfoItem == bundleInfos_.end()) {
7466         APP_LOGW("%{public}s not found", bundleName.c_str());
7467         return;
7468     }
7469     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
7470     for (const auto &dataItem : dataGroupInfos) {
7471         std::string oldGroupId = dataItem.first;
7472         if (dataGroupIdList.find(oldGroupId) == dataGroupIdList.end()) {
7473             bundleInfoItem->second.DeleteDataGroupInfo(oldGroupId);
7474         }
7475     }
7476     if (dataGroupIdList.empty()) {
7477         APP_LOGD("dataGroupIdList is empty");
7478         return;
7479     }
7480     std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
7481     std::unordered_set<int32_t> uniqueIdSet;
7482     GetDataGroupIndexMap(dataGroupIndexMap, uniqueIdSet);
7483     for (const std::string &groupId : dataGroupIdList) {
7484         DataGroupInfo dataGroupInfo;
7485         dataGroupInfo.dataGroupId = groupId;
7486         dataGroupInfo.userId = userId;
7487         auto iter = dataGroupIndexMap.find(groupId);
7488         if (iter != dataGroupIndexMap.end()) {
7489             dataGroupInfo.uuid = iter->second.second;
7490             int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
7491             dataGroupInfo.uid = uid;
7492             dataGroupInfo.gid = uid;
7493         } else {
7494             // need to generate a valid uniqueId
7495             GenerateDataGroupUuidAndUid(dataGroupInfo, userId, uniqueIdSet);
7496         }
7497         bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
7498         CreateGroupDirIfNotExist(dataGroupInfo);
7499     }
7500     ProcessAllUserDataGroupInfosWhenBundleUpdate(bundleInfoItem->second);
7501 }
7502 
CreateGroupDirIfNotExist(const DataGroupInfo & dataGroupInfo)7503 void BundleDataMgr::CreateGroupDirIfNotExist(const DataGroupInfo &dataGroupInfo)
7504 {
7505     std::string parentDir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR
7506         + std::to_string(dataGroupInfo.userId);
7507     if (!BundleUtil::IsExistDirNoLog(parentDir)) {
7508         APP_LOGE("group parent dir %{public}s not exist", parentDir.c_str());
7509         return;
7510     }
7511     std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
7512     if (BundleUtil::IsExistDirNoLog(dir)) {
7513         APP_LOGI("group dir exist, no need to create");
7514         return;
7515     }
7516     auto result = InstalldClient::GetInstance()->Mkdir(dir, ServiceConstants::DATA_GROUP_DIR_MODE,
7517         dataGroupInfo.uid, dataGroupInfo.gid);
7518     if (result != ERR_OK) {
7519         APP_LOGE("mkdir group dir failed, uid %{public}d err %{public}d", dataGroupInfo.uid, result);
7520     }
7521 }
7522 
GenerateNewUserDataGroupInfos(const std::string & bundleName,int32_t userId)7523 void BundleDataMgr::GenerateNewUserDataGroupInfos(const std::string &bundleName, int32_t userId)
7524 {
7525     APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
7526     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7527     auto bundleInfoItem = bundleInfos_.find(bundleName);
7528     if (bundleInfoItem == bundleInfos_.end()) {
7529         APP_LOGW("%{public}s not found", bundleName.c_str());
7530         return;
7531     }
7532     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
7533     if (dataGroupInfos.empty()) {
7534         return;
7535     }
7536     for (const auto &dataItem : dataGroupInfos) {
7537         std::string groupId = dataItem.first;
7538         if (dataItem.second.empty()) {
7539             APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
7540             continue;
7541         }
7542         DataGroupInfo dataGroupInfo;
7543         CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
7544         bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
7545         // group dir need to create
7546         CreateGroupDirIfNotExist(dataGroupInfo);
7547     }
7548     if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
7549         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
7550     }
7551 }
7552 
DeleteUserDataGroupInfos(const std::string & bundleName,int32_t userId,bool keepData)7553 void BundleDataMgr::DeleteUserDataGroupInfos(const std::string &bundleName, int32_t userId, bool keepData)
7554 {
7555     APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
7556     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7557     auto bundleInfoItem = bundleInfos_.find(bundleName);
7558     if (bundleInfoItem == bundleInfos_.end()) {
7559         APP_LOGW("%{public}s not found", bundleName.c_str());
7560         return;
7561     }
7562     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
7563     if (dataGroupInfos.empty()) {
7564         return;
7565     }
7566     for (const auto &dataItem : dataGroupInfos) {
7567         std::string groupId = dataItem.first;
7568         if (dataItem.second.empty()) {
7569             APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
7570             continue;
7571         }
7572         bundleInfoItem->second.RemoveGroupInfos(userId, groupId);
7573         if (!keepData && !IsDataGroupIdExistNoLock(groupId, userId)) {
7574             std::string dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR
7575                 + std::to_string(userId) + ServiceConstants::DATA_GROUP_PATH + dataItem.second[0].uuid;
7576             if (InstalldClient::GetInstance()->RemoveDir(dir) != ERR_OK) {
7577                 APP_LOGE("remove group dir %{private}s failed", dir.c_str());
7578             }
7579         }
7580     }
7581     if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
7582         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
7583     }
7584 }
7585 
GetDataGroupIndexMap(std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap,std::unordered_set<int32_t> & uniqueIdSet) const7586 void BundleDataMgr::GetDataGroupIndexMap(std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap,
7587     std::unordered_set<int32_t> &uniqueIdSet) const
7588 {
7589     for (const auto &bundleInfo : bundleInfos_) {
7590         for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
7591             for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
7592                 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
7593                     - DATA_GROUP_UID_OFFSET;
7594                 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
7595                     std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
7596                 uniqueIdSet.insert(index);
7597             });
7598         }
7599     }
7600 }
7601 
IsShareDataGroupIdNoLock(const std::string & dataGroupId,int32_t userId) const7602 bool BundleDataMgr::IsShareDataGroupIdNoLock(const std::string &dataGroupId, int32_t userId) const
7603 {
7604     APP_LOGD("IsShareDataGroupIdNoLock, dataGroupId is %{public}s", dataGroupId.c_str());
7605     int32_t count = 0;
7606     for (const auto &info : bundleInfos_) {
7607         auto dataGroupInfos = info.second.GetDataGroupInfos();
7608         auto iter = dataGroupInfos.find(dataGroupId);
7609         if (iter == dataGroupInfos.end()) {
7610             continue;
7611         }
7612 
7613         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
7614             [userId](const DataGroupInfo &dataGroupInfo) {
7615             return dataGroupInfo.userId == userId;
7616         });
7617         if (dataGroupIter == std::end(iter->second)) {
7618             continue;
7619         }
7620         count++;
7621         if (count > 1) {
7622             APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
7623             return true;
7624         }
7625     }
7626     return false;
7627 }
7628 
IsDataGroupIdExistNoLock(const std::string & dataGroupId,int32_t userId) const7629 bool BundleDataMgr::IsDataGroupIdExistNoLock(const std::string &dataGroupId, int32_t userId) const
7630 {
7631     APP_LOGD("dataGroupId is %{public}s, user %{public}d", dataGroupId.c_str(), userId);
7632     for (const auto &info : bundleInfos_) {
7633         auto dataGroupInfos = info.second.GetDataGroupInfos();
7634         auto iter = dataGroupInfos.find(dataGroupId);
7635         if (iter == dataGroupInfos.end()) {
7636             continue;
7637         }
7638 
7639         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
7640             [userId](const DataGroupInfo &dataGroupInfo) {
7641             return dataGroupInfo.userId == userId;
7642         });
7643         if (dataGroupIter == std::end(iter->second)) {
7644             continue;
7645         }
7646         return true;
7647     }
7648     return false;
7649 }
7650 
RemoveOldGroupDirs(const InnerBundleInfo & oldInfo) const7651 void BundleDataMgr::RemoveOldGroupDirs(const InnerBundleInfo &oldInfo) const
7652 {
7653     //find ids existed in oldInfo, but not in newInfo when there is no others share this id
7654     auto oldDatagroupInfos = oldInfo.GetDataGroupInfos();
7655     if (oldDatagroupInfos.empty()) {
7656         return;
7657     }
7658     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7659     const auto bundleInfoItem = bundleInfos_.find(oldInfo.GetBundleName());
7660     if (bundleInfoItem == bundleInfos_.end()) {
7661         APP_LOGE("find bundle %{public}s failed", oldInfo.GetBundleName().c_str());
7662         return;
7663     }
7664     auto newDataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
7665     std::unordered_set<int32_t> userIds = bundleInfoItem->second.GetUsers();
7666     for (const auto &oldDataItem : oldDatagroupInfos) {
7667         std::string oldGroupId = oldDataItem.first;
7668         if (oldDataItem.second.empty()) {
7669             APP_LOGE("infos empty in %{public}s %{public}s", oldInfo.GetBundleName().c_str(), oldGroupId.c_str());
7670             continue;
7671         }
7672         if (newDataGroupInfos.find(oldGroupId) != newDataGroupInfos.end()) {
7673             continue;
7674         }
7675         std::string uuid = oldDataItem.second[0].uuid;
7676         for (int32_t userId : userIds) {
7677             std::string dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR +
7678                 std::to_string(userId) + ServiceConstants::DATA_GROUP_PATH + uuid;
7679             if (!IsDataGroupIdExistNoLock(oldGroupId, userId)) {
7680                 APP_LOGI("-u %{public}d remove group dir %{private}s", userId, oldGroupId.c_str());
7681                 (void)InstalldClient::GetInstance()->RemoveDir(dir);
7682             }
7683         }
7684     }
7685 }
7686 
DeleteGroupDirsForException(const InnerBundleInfo & oldInfo,int32_t userId) const7687 void BundleDataMgr::DeleteGroupDirsForException(const InnerBundleInfo &oldInfo, int32_t userId) const
7688 {
7689     //find ids existed in newInfo, but not in oldInfo when there is no others share this id
7690     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7691     const auto bundleInfoItem = bundleInfos_.find(oldInfo.GetBundleName());
7692     if (bundleInfoItem == bundleInfos_.end()) {
7693         APP_LOGE("find bundle %{public}s failed", oldInfo.GetBundleName().c_str());
7694         return;
7695     }
7696     auto newDataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
7697     if (newDataGroupInfos.empty()) {
7698         return;
7699     }
7700     auto oldDatagroupInfos = oldInfo.GetDataGroupInfos();
7701     for (const auto &newDataItem : newDataGroupInfos) {
7702         std::string newGroupId = newDataItem.first;
7703         if (newDataItem.second.empty()) {
7704             APP_LOGE("infos empty in %{public}s %{public}s", oldInfo.GetBundleName().c_str(), newGroupId.c_str());
7705             continue;
7706         }
7707         if (oldDatagroupInfos.find(newGroupId) != oldDatagroupInfos.end() ||
7708             IsShareDataGroupIdNoLock(newGroupId, userId)) {
7709             continue;
7710         }
7711         std::string dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR +
7712             std::to_string(userId) + ServiceConstants::DATA_GROUP_PATH + newDataItem.second[0].uuid;
7713         APP_LOGI("remove group dir %{private}s", dir.c_str());
7714         if (InstalldClient::GetInstance()->RemoveDir(dir) != ERR_OK) {
7715             APP_LOGE("remove group dir %{private}s failed", dir.c_str());
7716         }
7717     }
7718 }
7719 
FindAbilityInfoInBundleInfo(const InnerBundleInfo & innerBundleInfo,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo) const7720 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
7721     const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
7722 {
7723     if (moduleName.empty()) {
7724         auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
7725         if (!ability) {
7726             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
7727         }
7728         abilityInfo = *ability;
7729         return ERR_OK;
7730     }
7731 
7732     ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
7733     if (ret != ERR_OK) {
7734         APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
7735     }
7736     return ret;
7737 }
7738 
ScanAllBundleGroupInfo()7739 void BundleDataMgr::ScanAllBundleGroupInfo()
7740 {
7741     // valid info, key: index, value: dataGroupId
7742     std::map<int32_t, std::string> indexMap;
7743     // valid info, key: dataGroupId, value: index
7744     std::map<std::string, int32_t> groupIdMap;
7745     // invalid infos, key: bundleNames, value: dataGroupId
7746     std::map<std::string, std::set<std::string>> needProcessGroupInfoBundleNames;
7747     // invalid GroupId
7748     std::set<std::string> errorGroupIds;
7749     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7750     for (const auto &info : bundleInfos_) {
7751         std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos = info.second.GetDataGroupInfos();
7752         if (dataGroupInfos.empty()) {
7753             continue;
7754         }
7755         for (const auto &dataGroupItem : dataGroupInfos) {
7756             std::string dataGroupId = dataGroupItem.first;
7757             if (dataGroupItem.second.empty()) {
7758                 APP_LOGW("dataGroupInfos is empty in %{public}s", dataGroupId.c_str());
7759                 continue;
7760             }
7761             int32_t groupUidIndex = dataGroupItem.second[0].uid -
7762                 dataGroupItem.second[0].userId * Constants::BASE_USER_RANGE - DATA_GROUP_UID_OFFSET;
7763             bool hasIndex = indexMap.find(groupUidIndex) != indexMap.end();
7764             if (!hasIndex && groupIdMap.find(dataGroupId) == groupIdMap.end()) {
7765                 indexMap[groupUidIndex] = dataGroupId;
7766                 groupIdMap[dataGroupId] = groupUidIndex;
7767                 continue;
7768             }
7769             if (!hasIndex && groupIdMap.find(dataGroupId) != groupIdMap.end()) {
7770                 APP_LOGW("id %{public}s has invalid index %{public}d, not index %{public}d",
7771                     dataGroupId.c_str(), groupIdMap[dataGroupId], groupUidIndex);
7772             }
7773             if (hasIndex && indexMap[groupUidIndex] == dataGroupId) {
7774                 continue;
7775             }
7776             if (hasIndex && indexMap[groupUidIndex] != dataGroupId) {
7777                 APP_LOGW("id %{public}s has invalid index %{public}d", dataGroupId.c_str(), groupUidIndex);
7778             }
7779             errorGroupIds.insert(dataGroupId);
7780             // invalid index or groupId
7781             APP_LOGW("error index %{public}d groudId %{public}s -n %{public}s",
7782                 groupUidIndex, dataGroupId.c_str(), info.first.c_str());
7783             needProcessGroupInfoBundleNames[info.first].insert(dataGroupId);
7784         }
7785     }
7786     HandleGroupIdAndIndex(errorGroupIds, indexMap, groupIdMap);
7787     if (!HandleErrorDataGroupInfos(groupIdMap, needProcessGroupInfoBundleNames)) {
7788         APP_LOGE("process bundle data group failed");
7789     }
7790 }
7791 
HandleGroupIdAndIndex(const std::set<std::string> errorGroupIds,std::map<int32_t,std::string> & indexMap,std::map<std::string,int32_t> & groupIdMap)7792 void BundleDataMgr::HandleGroupIdAndIndex(
7793     const std::set<std::string> errorGroupIds,
7794     std::map<int32_t, std::string> &indexMap,
7795     std::map<std::string, int32_t> &groupIdMap)
7796 {
7797     if (errorGroupIds.empty() || indexMap.empty() || groupIdMap.empty()) {
7798         return;
7799     }
7800     for (const auto &groupId : errorGroupIds) {
7801         if (groupIdMap.find(groupId) != groupIdMap.end()) {
7802             continue;
7803         }
7804         int32_t groupIndex = DATA_GROUP_INDEX_START;
7805         for (int32_t index = DATA_GROUP_INDEX_START; index < DATA_GROUP_UID_OFFSET; ++index) {
7806             if (indexMap.find(index) == indexMap.end()) {
7807                 groupIndex = index;
7808                 break;
7809             }
7810         }
7811         groupIdMap[groupId] = groupIndex;
7812         indexMap[groupIndex] = groupId;
7813     }
7814 }
7815 
HandleErrorDataGroupInfos(const std::map<std::string,int32_t> & groupIdMap,const std::map<std::string,std::set<std::string>> & needProcessGroupInfoBundleNames)7816 bool BundleDataMgr::HandleErrorDataGroupInfos(
7817     const std::map<std::string, int32_t> &groupIdMap,
7818     const std::map<std::string, std::set<std::string>> &needProcessGroupInfoBundleNames)
7819 {
7820     if (groupIdMap.empty() || needProcessGroupInfoBundleNames.empty()) {
7821         return true;
7822     }
7823     bool ret = true;
7824     for (const auto &item : needProcessGroupInfoBundleNames) {
7825         auto bundleInfoIter = bundleInfos_.find(item.first);
7826         if (bundleInfoIter == bundleInfos_.end()) {
7827             ret = false;
7828             continue;
7829         }
7830         std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos =
7831             bundleInfoIter->second.GetDataGroupInfos();
7832         if (dataGroupInfos.empty()) {
7833             continue;
7834         }
7835         auto userIds = bundleInfoIter->second.GetUsers();
7836         for (const auto &groudId : item.second) {
7837             auto groupIndexIter = groupIdMap.find(groudId);
7838             if (groupIndexIter == groupIdMap.end()) {
7839                 APP_LOGW("id map not found group %{public}s", groudId.c_str());
7840                 ret = false;
7841                 continue;
7842             }
7843             auto dataGroupInfoIter = dataGroupInfos.find(groudId);
7844             if ((dataGroupInfoIter == dataGroupInfos.end()) || dataGroupInfoIter->second.empty()) {
7845                 continue;
7846             }
7847             for (int32_t userId : userIds) {
7848                 DataGroupInfo dataGroupInfo;
7849                 dataGroupInfo.dataGroupId = groudId;
7850                 dataGroupInfo.userId = userId;
7851                 dataGroupInfo.uuid = dataGroupInfoIter->second[0].uuid;
7852                 int32_t uid = userId * Constants::BASE_USER_RANGE + groupIndexIter->second + DATA_GROUP_UID_OFFSET;
7853                 dataGroupInfo.uid = uid;
7854                 dataGroupInfo.gid = uid;
7855                 bundleInfoIter->second.AddDataGroupInfo(groudId, dataGroupInfo);
7856             }
7857         }
7858         if (!dataStorage_->SaveStorageBundleInfo(bundleInfoIter->second)) {
7859             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", item.first.c_str());
7860             ret = false;
7861         }
7862     }
7863     return ret;
7864 }
7865 
7866 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)7867 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
7868 {
7869     InnerBundleInfo targetInnerBundleInfo;
7870     std::string targetBundleName = newInfo.GetTargetBundleName();
7871     auto targetInfoItem = bundleInfos_.find(targetBundleName);
7872     if (targetInfoItem != bundleInfos_.end()) {
7873         targetInnerBundleInfo = targetInfoItem->second;
7874     }
7875 
7876     if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
7877         APP_LOGW("update overlay info failed");
7878         return false;
7879     }
7880     // storage target bundle info
7881     if (!targetInnerBundleInfo.GetBundleName().empty() &&
7882         dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
7883         bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
7884     }
7885     // build overlay connection for external overlay
7886     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
7887         const auto &moduleInfos = newInfo.GetInnerModuleInfos();
7888         std::string moduleName = (moduleInfos.begin()->second).moduleName;
7889         BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
7890     }
7891     return true;
7892 }
7893 
ResetExternalOverlayModuleState(const std::string & bundleName,const std::string & modulePackage)7894 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
7895 {
7896     for (auto &info : bundleInfos_) {
7897         if (info.second.GetTargetBundleName() != bundleName) {
7898             continue;
7899         }
7900         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
7901         for (const auto &moduleInfo : innerModuleInfos) {
7902             if (moduleInfo.second.targetModuleName == modulePackage) {
7903                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
7904                 break;
7905             }
7906         }
7907         if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
7908             APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
7909         }
7910     }
7911 }
7912 
BuildExternalOverlayConnection(const std::string & moduleName,InnerBundleInfo & oldInfo,int32_t userId)7913 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
7914     int32_t userId)
7915 {
7916     APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
7917         moduleName.c_str(), userId);
7918     for (auto &info : bundleInfos_) {
7919         if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
7920             continue;
7921         }
7922         // check target bundle is preInstall application
7923         if (!oldInfo.IsPreInstallApp()) {
7924             APP_LOGW("target bundle is not preInstall application");
7925             return;
7926         }
7927 
7928         // check fingerprint of current bundle with target bundle
7929         if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
7930             APP_LOGW("target bundle has different fingerprint with current bundle");
7931             return;
7932         }
7933         // external overlay does not support FA model
7934         if (!oldInfo.GetIsNewVersion()) {
7935             APP_LOGW("target bundle is not stage model");
7936             return;
7937         }
7938         // external overlay does not support service
7939         if (oldInfo.GetEntryInstallationFree()) {
7940             APP_LOGW("target bundle is service");
7941             return;
7942         }
7943 
7944         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
7945         std::vector<std::string> overlayModuleVec;
7946         for (const auto &moduleInfo : innerModuleInfos) {
7947             if (moduleInfo.second.targetModuleName != moduleName) {
7948                 continue;
7949             }
7950             OverlayModuleInfo overlayModuleInfo;
7951             overlayModuleInfo.bundleName = info.second.GetBundleName();
7952             overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
7953             overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
7954             overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
7955             overlayModuleInfo.priority = moduleInfo.second.targetPriority;
7956             oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
7957             overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
7958         }
7959         std::string bundleDir;
7960         const std::string &moduleHapPath =
7961             info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
7962         OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
7963         OverlayBundleInfo overlayBundleInfo;
7964         overlayBundleInfo.bundleName = info.second.GetBundleName();
7965         overlayBundleInfo.bundleDir = bundleDir;
7966         overlayBundleInfo.state = info.second.GetOverlayState();
7967         overlayBundleInfo.priority = info.second.GetTargetPriority();
7968         oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
7969         auto userSet = GetAllUser();
7970         for (const auto &innerUserId : userSet) {
7971             for (const auto &overlayModule : overlayModuleVec) {
7972                 int32_t state = OverlayState::OVERLAY_INVALID;
7973                 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
7974                 if (state == OverlayState::OVERLAY_INVALID) {
7975                     info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
7976                 }
7977             }
7978         }
7979     }
7980 }
7981 
RemoveOverlayInfoAndConnection(const InnerBundleInfo & innerBundleInfo,const std::string & bundleName)7982 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
7983     const std::string &bundleName)
7984 {
7985     if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
7986         std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
7987         auto targetInfoItem = bundleInfos_.find(targetBundleName);
7988         if (targetInfoItem == bundleInfos_.end()) {
7989             APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
7990         } else {
7991             InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
7992             OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
7993             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
7994                 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
7995                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
7996             }
7997         }
7998     }
7999 
8000     if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8001         for (auto &info : bundleInfos_) {
8002             if (info.second.GetTargetBundleName() != bundleName) {
8003                 continue;
8004             }
8005             const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8006             for (const auto &moduleInfo : innerModuleInfos) {
8007                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8008             }
8009             dataStorage_->SaveStorageBundleInfo(info.second);
8010         }
8011     }
8012 }
8013 #endif
8014 
GetOldAppIds(const std::string & bundleName,std::vector<std::string> & appIds) const8015 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
8016 {
8017     if (bundleName.empty()) {
8018         APP_LOGE("bundleName is empty");
8019         return false;
8020     }
8021     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8022     auto innerBundleInfo = bundleInfos_.find(bundleName);
8023     if (innerBundleInfo == bundleInfos_.end()) {
8024         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8025         return false;
8026     }
8027     appIds = innerBundleInfo->second.GetOldAppIds();
8028     return true;
8029 }
8030 
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo & oldInfo,const InnerBundleInfo & newInfo) const8031 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
8032     const InnerBundleInfo &newInfo) const
8033 {
8034     return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
8035         !oldInfo.HasEntry() || newInfo.HasEntry() ||
8036         (oldInfo.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE &&
8037         oldInfo.GetVersionCode() < newInfo.GetVersionCode());
8038 }
8039 
GetModuleNameByBundleAndAbility(const std::string & bundleName,const std::string & abilityName)8040 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
8041     const std::string& bundleName, const std::string& abilityName)
8042 {
8043     if (bundleName.empty() || abilityName.empty()) {
8044         APP_LOGE("bundleName or abilityName is empty");
8045         return std::string();
8046     }
8047     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8048     auto innerBundleInfo = bundleInfos_.find(bundleName);
8049     if (innerBundleInfo == bundleInfos_.end()) {
8050         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8051         return std::string();
8052     }
8053     auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
8054     if (!abilityInfo) {
8055         APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
8056             bundleName.c_str(), abilityName.c_str());
8057         return std::string();
8058     }
8059     return abilityInfo->moduleName;
8060 }
8061 
SetAdditionalInfo(const std::string & bundleName,const std::string & additionalInfo) const8062 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
8063 {
8064     APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
8065     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8066     auto infoItem = bundleInfos_.find(bundleName);
8067     if (infoItem == bundleInfos_.end()) {
8068         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8069         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8070     }
8071 
8072     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8073         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8074         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8075         if (responseUserId == Constants::INVALID_USERID) {
8076             APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
8077             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8078         }
8079     }
8080 
8081     auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
8082     if (appProvisionInfoManager == nullptr) {
8083         APP_LOGE("Failed, appProvisionInfoManager is nullptr");
8084         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8085     }
8086 
8087     if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
8088         APP_LOGE("BundleName: %{public}s set additional info failed", bundleName.c_str());
8089         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8090     }
8091 
8092     ElementName element;
8093     element.SetBundleName(bundleName);
8094     OHOS::AAFwk::Want want;
8095     want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
8096     want.SetElement(element);
8097     EventFwk::CommonEventData commonData { want };
8098     NotifyBundleEventCallback(commonData);
8099     return ERR_OK;
8100 }
8101 
GetAppServiceHspBundleInfo(const std::string & bundleName,BundleInfo & bundleInfo)8102 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
8103 {
8104     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
8105     if (bundleName.empty()) {
8106         APP_LOGE("bundleName is empty");
8107         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
8108     }
8109 
8110     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8111     auto infoItem = bundleInfos_.find(bundleName);
8112     if (infoItem == bundleInfos_.end()) {
8113         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8114         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8115     }
8116     const InnerBundleInfo &innerBundleInfo = infoItem->second;
8117     auto res = innerBundleInfo.GetAppServiceHspInfo(bundleInfo);
8118     if (res != ERR_OK) {
8119         APP_LOGW("get hspInfo %{public}s fail", bundleName.c_str());
8120         return res;
8121     }
8122     return ERR_OK;
8123 }
8124 
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo & innerBundleInfo,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos) const8125 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
8126     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
8127 {
8128     APP_LOGD("start");
8129     BundleInfo bundleInfo;
8130     if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
8131         APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
8132         for (const auto &hapModule : bundleInfo.hapModuleInfos) {
8133             BaseSharedBundleInfo baseSharedBundleInfo;
8134             baseSharedBundleInfo.bundleName = bundleInfo.name;
8135             baseSharedBundleInfo.moduleName = hapModule.moduleName;
8136             baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
8137             baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
8138             baseSharedBundleInfo.hapPath = hapModule.hapPath;
8139             baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
8140             baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
8141             baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
8142         }
8143         return;
8144     }
8145     APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
8146 }
8147 
AddAppHspBundleName(const BundleType type,const std::string & bundleName)8148 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
8149 {
8150     if (type == BundleType::APP_SERVICE_FWK) {
8151         APP_LOGD("add app hsp bundleName:%{pubcli}s", bundleName.c_str());
8152         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
8153         appServiceHspBundleName_.insert(bundleName);
8154     }
8155 }
8156 
CreateGroupDir(const InnerBundleInfo & innerBundleInfo,int32_t userId) const8157 void BundleDataMgr::CreateGroupDir(const InnerBundleInfo &innerBundleInfo, int32_t userId) const
8158 {
8159     std::vector<DataGroupInfo> infos;
8160     auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8161     for (const auto &item : dataGroupInfos) {
8162         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
8163             [userId](const DataGroupInfo &info) {
8164             return info.userId == userId;
8165         });
8166         if (dataGroupIter != std::end(item.second)) {
8167             infos.push_back(*dataGroupIter);
8168         }
8169     }
8170     if (infos.empty()) {
8171         return;
8172     }
8173 
8174     std::string parentDir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR
8175         + std::to_string(userId);
8176     if (!BundleUtil::IsExistDir(parentDir)) {
8177         APP_LOGE("parent dir(%{public}s) missing: group", parentDir.c_str());
8178         return;
8179     }
8180     for (const DataGroupInfo &dataGroupInfo : infos) {
8181         std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
8182         APP_LOGD("create group dir: %{public}s", dir.c_str());
8183         auto result = InstalldClient::GetInstance()->Mkdir(dir,
8184             ServiceConstants::DATA_GROUP_DIR_MODE, dataGroupInfo.uid, dataGroupInfo.gid);
8185         if (result != ERR_OK) {
8186             APP_LOGW("%{public}s group dir %{public}s userId %{public}d failed",
8187                 innerBundleInfo.GetBundleName().c_str(), dataGroupInfo.uuid.c_str(), userId);
8188         }
8189     }
8190 }
8191 
CreateBundleDataDir(int32_t userId)8192 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId)
8193 {
8194     APP_LOGI("CreateBundleDataDir with userId %{public}d begin", userId);
8195     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8196     std::vector<CreateDirParam> createDirParams;
8197     std::vector<CreateDirParam> el5Params;
8198     for (const auto &item : bundleInfos_) {
8199         const InnerBundleInfo &info = item.second;
8200         int32_t responseUserId = info.GetResponseUserId(userId);
8201         if (responseUserId == Constants::INVALID_USERID) {
8202             APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
8203                 info.GetBundleName().c_str(), userId);
8204             continue;
8205         }
8206         CreateDirParam createDirParam;
8207         createDirParam.bundleName = info.GetBundleName();
8208         createDirParam.userId = responseUserId;
8209         createDirParam.uid = info.GetUid(responseUserId);
8210         createDirParam.gid = info.GetGid(responseUserId);
8211         createDirParam.apl = info.GetAppPrivilegeLevel();
8212         createDirParam.isPreInstallApp = info.IsPreInstallApp();
8213         createDirParam.debug = info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
8214         createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
8215         createDirParam.extensionDirs = info.GetAllExtensionDirs();
8216         createDirParams.emplace_back(createDirParam);
8217 
8218         std::vector<RequestPermission> reqPermissions = info.GetAllRequestPermissions();
8219         auto it = std::find_if(reqPermissions.begin(), reqPermissions.end(), [](const RequestPermission& permission) {
8220             return permission.name == PERMISSION_PROTECT_SCREEN_LOCK_DATA;
8221         });
8222         if (it != reqPermissions.end()) {
8223             el5Params.emplace_back(createDirParam);
8224         }
8225         CreateGroupDir(info, responseUserId);
8226     }
8227     lock.unlock();
8228     auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
8229     APP_LOGI("CreateBundleDataDir result: %{public}d", res);
8230     CreateEl5Dir(el5Params);
8231     return res;
8232 }
8233 
CreateBundleDataDirWithEl(int32_t userId,DataDirEl dirEl)8234 ErrCode BundleDataMgr::CreateBundleDataDirWithEl(int32_t userId, DataDirEl dirEl)
8235 {
8236     APP_LOGI("with -u %{public}d -el %{public}d begin", userId, static_cast<uint8_t>(dirEl));
8237     std::vector<CreateDirParam> createDirParams;
8238     {
8239         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8240         for (const auto &item : bundleInfos_) {
8241             const InnerBundleInfo &info = item.second;
8242             if (!info.HasInnerBundleUserInfo(userId)) {
8243                 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
8244                     info.GetBundleName().c_str(), userId);
8245                 continue;
8246             }
8247             if (dirEl == DataDirEl::EL5 && !info.NeedCreateEl5Dir()) {
8248                 continue;
8249             }
8250             CreateDirParam createDirParam;
8251             createDirParam.bundleName = info.GetBundleName();
8252             createDirParam.userId = userId;
8253             createDirParam.uid = info.GetUid(userId);
8254             createDirParam.gid = info.GetGid(userId);
8255             createDirParam.apl = info.GetAppPrivilegeLevel();
8256             createDirParam.isPreInstallApp = info.IsPreInstallApp();
8257             createDirParam.debug =
8258                 info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
8259             createDirParam.extensionDirs = info.GetAllExtensionDirs();
8260             createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
8261             createDirParam.dataDirEl = dirEl;
8262             createDirParams.emplace_back(createDirParam);
8263             CreateGroupDir(info, userId);
8264         }
8265     }
8266     ErrCode res = ERR_OK;
8267     if (dirEl != DataDirEl::EL5) {
8268         res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
8269     } else {
8270         CreateEl5Dir(createDirParams);
8271     }
8272     APP_LOGI("with -u %{public}d -el %{public}d end", userId, static_cast<uint8_t>(dirEl));
8273     return res;
8274 }
8275 
CreateEl5Dir(const std::vector<CreateDirParam> & el5Params)8276 void BundleDataMgr::CreateEl5Dir(const std::vector<CreateDirParam> &el5Params)
8277 {
8278     for (const auto &el5Param : el5Params) {
8279         APP_LOGI("-n %{public}s -u %{public}d", el5Param.bundleName.c_str(), el5Param.userId);
8280         InnerCreateEl5Dir(el5Param);
8281         SetEl5DirPolicy(el5Param);
8282     }
8283 }
8284 
GetUidByBundleName(const std::string & bundleName,int32_t userId,int32_t appIndex) const8285 int32_t BundleDataMgr::GetUidByBundleName(const std::string &bundleName, int32_t userId, int32_t appIndex) const
8286 {
8287     if (bundleName.empty()) {
8288         APP_LOGW("bundleName is empty");
8289         return Constants::INVALID_UID;
8290     }
8291 
8292     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8293     auto infoItem = bundleInfos_.find(bundleName);
8294     if (infoItem == bundleInfos_.end()) {
8295         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
8296         return Constants::INVALID_UID;
8297     }
8298     const InnerBundleInfo &innerBundleInfo = infoItem->second;
8299     if (userId == Constants::UNSPECIFIED_USERID) {
8300         userId = GetUserIdByCallingUid();
8301     }
8302     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8303     return innerBundleInfo.GetUid(responseUserId, appIndex);
8304 }
8305 
InnerCreateEl5Dir(const CreateDirParam & el5Param)8306 void BundleDataMgr::InnerCreateEl5Dir(const CreateDirParam &el5Param)
8307 {
8308     std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
8309         ServiceConstants::PATH_SEPARATOR + std::to_string(el5Param.userId);
8310     if (!BundleUtil::IsExistDir(parentDir)) {
8311         APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
8312         return;
8313     }
8314     std::vector<std::string> dirs;
8315     dirs.emplace_back(parentDir + ServiceConstants::BASE + el5Param.bundleName);
8316     dirs.emplace_back(parentDir + ServiceConstants::DATABASE + el5Param.bundleName);
8317     for (const std::string &dir : dirs) {
8318         uint32_t mode = S_IRWXU;
8319         int32_t gid = el5Param.uid;
8320         if (dir.find(ServiceConstants::DATABASE) != std::string::npos) {
8321             mode = S_IRWXU | S_IRWXG | S_ISGID;
8322             gid = ServiceConstants::DATABASE_DIR_GID;
8323         }
8324         if (InstalldClient::GetInstance()->Mkdir(dir, mode, el5Param.uid, gid) != ERR_OK) {
8325             LOG_W(BMS_TAG_INSTALLER, "create el5 dir %{public}s failed", dir.c_str());
8326         }
8327         ErrCode result = InstalldClient::GetInstance()->SetDirApl(
8328             dir, el5Param.bundleName, el5Param.apl, el5Param.isPreInstallApp, el5Param.debug);
8329         if (result != ERR_OK) {
8330             LOG_W(BMS_TAG_INSTALLER, "fail to SetDirApl dir %{public}s, error is %{public}d", dir.c_str(), result);
8331         }
8332     }
8333 }
8334 
SetEl5DirPolicy(const CreateDirParam & el5Param)8335 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param)
8336 {
8337     InnerBundleInfo info;
8338     if (!FetchInnerBundleInfo(el5Param.bundleName, info)) {
8339         LOG_E(BMS_TAG_INSTALLER, "get bundle %{public}s failed", el5Param.bundleName.c_str());
8340         return;
8341     }
8342     InnerBundleUserInfo userInfo;
8343     if (!info.GetInnerBundleUserInfo(el5Param.userId, userInfo)) {
8344         LOG_E(BMS_TAG_INSTALLER, "%{public}s get user %{public}d failed",
8345             info.GetBundleName().c_str(), el5Param.userId);
8346         return;
8347     }
8348     int32_t uid = userInfo.uid;
8349     std::string keyId = "";
8350     auto result = InstalldClient::GetInstance()->SetEncryptionPolicy(uid, info.GetBundleName(), el5Param.userId, keyId);
8351     if (result != ERR_OK) {
8352         LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
8353     }
8354     LOG_D(BMS_TAG_INSTALLER, "%{public}s, keyId: %{public}s", info.GetBundleName().c_str(), keyId.c_str());
8355     info.SetkeyId(el5Param.userId, keyId);
8356     if (!UpdateInnerBundleInfo(info)) {
8357         LOG_E(BMS_TAG_INSTALLER, "save keyId failed");
8358     }
8359 }
8360 
CanOpenLink(const std::string & link,bool & canOpen) const8361 ErrCode BundleDataMgr::CanOpenLink(
8362     const std::string &link, bool &canOpen) const
8363 {
8364     APP_LOGI("link: %{public}s", link.c_str());
8365     auto uid = IPCSkeleton::GetCallingUid();
8366     InnerBundleInfo innerBundleInfo;
8367     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
8368         APP_LOGE("get innerBundleInfo by uid :%{public}d failed", uid);
8369         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8370     }
8371     auto querySchemes = innerBundleInfo.GetQuerySchemes();
8372     if (querySchemes.empty()) {
8373         APP_LOGI("querySchemes is empty");
8374         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8375     }
8376 
8377     size_t pos = link.find(SCHEME_END);
8378     if (pos == std::string::npos) {
8379         APP_LOGE("parse link : %{public}s failed", link.c_str());
8380         return ERR_BUNDLE_MANAGER_INVALID_SCHEME;
8381     }
8382     std::string scheme = link.substr(0, pos);
8383     transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
8384     if (std::find(querySchemes.begin(), querySchemes.end(), scheme) == querySchemes.end()) {
8385         APP_LOGI("scheme :%{public}s is not in the querySchemes", scheme.c_str());
8386         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8387     }
8388 
8389     Want want;
8390     want.SetUri(link);
8391     std::vector<AbilityInfo> abilityInfos;
8392     // implicit query
8393     ErrCode ret = ImplicitQueryAbilityInfosV9(
8394         want, static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), GetUserIdByUid(uid), abilityInfos);
8395     if (ret != ERR_OK) {
8396         APP_LOGD("implicit queryAbilityInfosV9 error");
8397         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8398     }
8399 
8400     canOpen = !abilityInfos.empty();
8401     APP_LOGI("canOpen : %{public}d", canOpen);
8402     return ERR_OK;
8403 }
8404 
GenerateOdid(const std::string & developerId,std::string & odid) const8405 void BundleDataMgr::GenerateOdid(const std::string &developerId, std::string &odid) const
8406 {
8407     APP_LOGD("start, developerId:%{public}s", developerId.c_str());
8408     if (developerId.empty()) {
8409         APP_LOGE("developerId is empty");
8410         return;
8411     }
8412     std::string groupId = BundleUtil::ExtractGroupIdByDevelopId(developerId);
8413     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8414     for (const auto &item : bundleInfos_) {
8415         std::string developerIdExist;
8416         std::string odidExist;
8417         item.second.GetDeveloperidAndOdid(developerIdExist, odidExist);
8418         std::string groupIdExist = BundleUtil::ExtractGroupIdByDevelopId(developerIdExist);
8419         if (groupId == groupIdExist) {
8420             odid = odidExist;
8421             return;
8422         }
8423     }
8424     odid = BundleUtil::GenerateUuid();
8425     APP_LOGI_NOFUNC("developerId:%{public}s not existed generate odid %{private}s",
8426         developerId.c_str(), odid.c_str());
8427 }
8428 
GetOdid(std::string & odid) const8429 ErrCode BundleDataMgr::GetOdid(std::string &odid) const
8430 {
8431     int32_t callingUid = IPCSkeleton::GetCallingUid();
8432     InnerBundleInfo innerBundleInfo;
8433     if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8434         if (sandboxAppHelper_ == nullptr) {
8435             APP_LOGE("sandboxAppHelper_ is nullptr");
8436             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8437         }
8438         if (sandboxAppHelper_->GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8439             APP_LOGW("app that corresponds to the callingUid %{public}d could not be found", callingUid);
8440             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8441         }
8442     }
8443     std::string developerId;
8444     innerBundleInfo.GetDeveloperidAndOdid(developerId, odid);
8445     return ERR_OK;
8446 }
8447 
GetOdidByBundleName(const std::string & bundleName,std::string & odid) const8448 ErrCode BundleDataMgr::GetOdidByBundleName(const std::string &bundleName, std::string &odid) const
8449 {
8450     APP_LOGI_NOFUNC("start GetOdidByBundleName -n %{public}s", bundleName.c_str());
8451     InnerBundleInfo innerBundleInfo;
8452     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8453     const auto &item = bundleInfos_.find(bundleName);
8454     if (item == bundleInfos_.end()) {
8455         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
8456         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8457     }
8458     const InnerBundleInfo &bundleInfo = item->second;
8459     bundleInfo.GetOdid(odid);
8460     return ERR_OK;
8461 }
8462 
ProcessAllowedAcls(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo) const8463 void BundleDataMgr::ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const
8464 {
8465     if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
8466         oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
8467         return;
8468     }
8469     oldInfo.AddAllowedAcls(newInfo.GetAllowedAcls());
8470 }
8471 
GetAllBundleInfoByDeveloperId(const std::string & developerId,std::vector<BundleInfo> & bundleInfos,int32_t userId)8472 ErrCode BundleDataMgr::GetAllBundleInfoByDeveloperId(const std::string &developerId,
8473     std::vector<BundleInfo> &bundleInfos, int32_t userId)
8474 {
8475     int32_t requestUserId = GetUserId(userId);
8476     APP_LOGI("requestUserId: %{public}d", requestUserId);
8477     if (requestUserId == Constants::INVALID_USERID) {
8478         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8479     }
8480 
8481     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8482     if (bundleInfos_.empty()) {
8483         APP_LOGW("bundleInfos_ data is empty");
8484         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8485     }
8486     for (const auto &item : bundleInfos_) {
8487         const InnerBundleInfo &innerBundleInfo = item.second;
8488         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
8489             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
8490             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
8491                 innerBundleInfo.GetBundleName().c_str());
8492             continue;
8493         }
8494 
8495         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8496         auto flag = GET_BASIC_APPLICATION_INFO;
8497         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
8498             continue;
8499         }
8500         // check developerId
8501         std::string developerIdExist;
8502         std::string odidExist;
8503         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
8504         if (developerIdExist != developerId) {
8505             continue;
8506         }
8507 
8508         BundleInfo bundleInfo;
8509 
8510         if (innerBundleInfo.GetBundleInfoV9(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION),
8511             bundleInfo, responseUserId) != ERR_OK) {
8512             continue;
8513         }
8514         bundleInfos.emplace_back(bundleInfo);
8515     }
8516     if (bundleInfos.empty()) {
8517         APP_LOGW("bundleInfos is empty");
8518         return ERR_BUNDLE_MANAGER_INVALID_DEVELOPERID;
8519     }
8520     APP_LOGI("have %{public}d applications, their developerId is %{public}s", requestUserId, developerId.c_str());
8521     return ERR_OK;
8522 }
8523 
GetDeveloperIds(const std::string & appDistributionType,std::vector<std::string> & developerIdList,int32_t userId)8524 ErrCode BundleDataMgr::GetDeveloperIds(const std::string &appDistributionType,
8525     std::vector<std::string> &developerIdList, int32_t userId)
8526 {
8527     int32_t requestUserId = GetUserId(userId);
8528     APP_LOGI("requestUserId: %{public}d", requestUserId);
8529     if (requestUserId == Constants::INVALID_USERID) {
8530         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8531     }
8532 
8533     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8534     if (bundleInfos_.empty()) {
8535         APP_LOGW("bundleInfos_ data is empty");
8536         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8537     }
8538     std::set<std::string> developerIdSet;
8539     for (const auto &item : bundleInfos_) {
8540         const InnerBundleInfo &innerBundleInfo = item.second;
8541         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
8542             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
8543             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
8544                 innerBundleInfo.GetBundleName().c_str());
8545             continue;
8546         }
8547 
8548         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8549         auto flag = GET_BASIC_APPLICATION_INFO;
8550         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
8551             continue;
8552         }
8553         // check appDistributionType
8554         if (!appDistributionType.empty() && innerBundleInfo.GetAppDistributionType() != appDistributionType) {
8555             continue;
8556         }
8557 
8558         std::string developerIdExist;
8559         std::string odidExist;
8560         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
8561         developerIdSet.emplace(developerIdExist);
8562     }
8563     for (const std::string &developerId : developerIdSet) {
8564         developerIdList.emplace_back(developerId);
8565     }
8566     APP_LOGI("have %{public}d developers, their appDistributionType is %{public}s",
8567         static_cast<int32_t>(developerIdList.size()), appDistributionType.c_str());
8568     return ERR_OK;
8569 }
8570 
SwitchUninstallState(const std::string & bundleName,const bool & state,const bool isNeedSendNotify)8571 ErrCode BundleDataMgr::SwitchUninstallState(const std::string &bundleName, const bool &state,
8572     const bool isNeedSendNotify)
8573 {
8574     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8575     auto infoItem = bundleInfos_.find(bundleName);
8576     if (infoItem == bundleInfos_.end()) {
8577         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8578         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8579     }
8580     InnerBundleInfo &innerBundleInfo = infoItem->second;
8581     if (!innerBundleInfo.IsRemovable() && state) {
8582         APP_LOGW("the bundle : %{public}s is not removable", bundleName.c_str());
8583         return ERR_BUNDLE_MANAGER_BUNDLE_CAN_NOT_BE_UNINSTALLED;
8584     }
8585     if (innerBundleInfo.GetUninstallState() == state) {
8586         return ERR_OK;
8587     }
8588     innerBundleInfo.SetUninstallState(state);
8589     innerBundleInfo.SetNeedSendNotify(isNeedSendNotify);
8590     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
8591         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8592         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8593     }
8594     return ERR_OK;
8595 }
8596 
AddCloneBundle(const std::string & bundleName,const InnerBundleCloneInfo & attr)8597 ErrCode BundleDataMgr::AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)
8598 {
8599     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8600     auto infoItem = bundleInfos_.find(bundleName);
8601     if (infoItem == bundleInfos_.end()) {
8602         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8603         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8604     }
8605     InnerBundleInfo &innerBundleInfo = infoItem->second;
8606     ErrCode res = innerBundleInfo.AddCloneBundle(attr);
8607     if (res != ERR_OK) {
8608         APP_LOGE("innerBundleInfo addCloneBundleInfo fail");
8609         return res;
8610     }
8611     APP_LOGD("update bundle info in memory for add clone, userId: %{public}d, appIndex: %{public}d",
8612         attr.userId, attr.appIndex);
8613     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
8614     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
8615     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
8616         innerBundleInfo.SetBundleStatus(nowBundleStatus);
8617         innerBundleInfo.RemoveCloneBundle(attr.userId, attr.appIndex);
8618         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8619         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8620     }
8621     innerBundleInfo.SetBundleStatus(nowBundleStatus);
8622     APP_LOGD("update bundle info in storage for add clone, userId: %{public}d, appIndex: %{public}d",
8623         attr.userId, attr.appIndex);
8624     return ERR_OK;
8625 }
8626 
FilterAbilityInfosByAppLinking(const Want & want,int32_t flags,std::vector<AbilityInfo> & abilityInfos) const8627 void BundleDataMgr::FilterAbilityInfosByAppLinking(const Want &want, int32_t flags,
8628     std::vector<AbilityInfo> &abilityInfos) const
8629 {
8630 #ifdef APP_DOMAIN_VERIFY_ENABLED
8631     APP_LOGD("FilterAbility start");
8632     if (abilityInfos.empty()) {
8633         APP_LOGD("abilityInfos is empty");
8634         return;
8635     }
8636     if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
8637         APP_LOGD("scheme is not https");
8638         if ((static_cast<uint32_t>(flags) &
8639             static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
8640             static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) {
8641             APP_LOGI("using app linking flag and scheme is not https, return empty list");
8642             abilityInfos.clear();
8643         }
8644         return;
8645     }
8646     std::vector<AbilityInfo> filteredAbilityInfos;
8647     // call FiltedAbilityInfos
8648     APP_LOGI("call FilterAbilities");
8649     std::string identity = IPCSkeleton::ResetCallingIdentity();
8650     if (!DelayedSingleton<AppDomainVerify::AppDomainVerifyMgrClient>::GetInstance()->FilterAbilities(
8651         want, abilityInfos, filteredAbilityInfos)) {
8652         APP_LOGE("FilterAbilities failed");
8653     }
8654     IPCSkeleton::SetCallingIdentity(identity);
8655     if ((static_cast<uint32_t>(flags) &
8656         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
8657         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) {
8658         APP_LOGD("return filteredAbilityInfos");
8659         abilityInfos = filteredAbilityInfos;
8660         for (auto &abilityInfo : abilityInfos) {
8661             abilityInfo.linkType = LinkType::APP_LINK;
8662         }
8663         return;
8664     }
8665     for (auto &filteredAbilityInfo : filteredAbilityInfos) {
8666         for (auto &abilityInfo : abilityInfos) {
8667             if (filteredAbilityInfo.bundleName == abilityInfo.bundleName &&
8668                 filteredAbilityInfo.name == abilityInfo.name) {
8669                 abilityInfo.linkType = LinkType::APP_LINK;
8670                 break;
8671             }
8672         }
8673     }
8674     return;
8675 #else
8676     APP_LOGI("AppDomainVerify is not enabled");
8677     return;
8678 #endif
8679 }
8680 
RemoveCloneBundle(const std::string & bundleName,const int32_t userId,int32_t appIndex)8681 ErrCode BundleDataMgr::RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)
8682 {
8683     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8684     auto infoItem = bundleInfos_.find(bundleName);
8685     if (infoItem == bundleInfos_.end()) {
8686         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8687         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8688     }
8689     InnerBundleInfo &innerBundleInfo = infoItem->second;
8690     ErrCode res = innerBundleInfo.RemoveCloneBundle(userId, appIndex);
8691     if (res != ERR_OK) {
8692         APP_LOGE("innerBundleInfo RemoveCloneBundle fail");
8693         return res;
8694     }
8695     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
8696     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
8697     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
8698         innerBundleInfo.SetBundleStatus(nowBundleStatus);
8699         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8700         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8701     }
8702     innerBundleInfo.SetBundleStatus(nowBundleStatus);
8703     DeleteDesktopShortcutInfo(bundleName, userId, appIndex);
8704     return ERR_OK;
8705 }
8706 
QueryAbilityInfoByContinueType(const std::string & bundleName,const std::string & continueType,AbilityInfo & abilityInfo,int32_t userId,int32_t appIndex) const8707 ErrCode BundleDataMgr::QueryAbilityInfoByContinueType(const std::string &bundleName,
8708     const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const
8709 {
8710     int32_t requestUserId = GetUserId(userId);
8711     APP_LOGI("requestUserId: %{public}d", requestUserId);
8712     if (requestUserId == Constants::INVALID_USERID) {
8713         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8714     }
8715 
8716     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8717     if (bundleInfos_.empty()) {
8718         APP_LOGW("bundleInfos_ data is empty");
8719         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8720     }
8721     InnerBundleInfo innerBundleInfo;
8722     if (appIndex == 0) {
8723         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, 0, innerBundleInfo, requestUserId);
8724         if (ret != ERR_OK) {
8725             APP_LOGD("QueryAbilityInfoByContinueType failed, bundleName:%{public}s", bundleName.c_str());
8726             return ret;
8727         }
8728     }
8729     if (appIndex > 0) {
8730         if (sandboxAppHelper_ == nullptr) {
8731             APP_LOGW("sandboxAppHelper_ is nullptr");
8732             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8733         }
8734         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
8735         if (ret != ERR_OK) {
8736             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
8737                 ret, bundleName.c_str());
8738             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8739         }
8740     }
8741     auto ability = innerBundleInfo.FindAbilityInfo(continueType, requestUserId);
8742     if (!ability) {
8743         APP_LOGW("ability not found, bundleName:%{public}s, coutinueType:%{public}s",
8744             bundleName.c_str(), continueType.c_str());
8745         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8746     }
8747     abilityInfo = (*ability);
8748     InnerBundleUserInfo innerBundleUserInfo;
8749     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
8750         abilityInfo.uid = innerBundleUserInfo.uid;
8751     }
8752     return ERR_OK;
8753 }
8754 
QueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const8755 ErrCode BundleDataMgr::QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
8756     int32_t appIndex, AbilityInfo &abilityInfo) const
8757 {
8758     std::string bundleName = element.GetBundleName();
8759     std::string abilityName = element.GetAbilityName();
8760     std::string moduleName = element.GetModuleName();
8761     LOG_D(BMS_TAG_QUERY,
8762         "QueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8763         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8764     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
8765     int32_t requestUserId = GetUserId(userId);
8766     if (requestUserId == Constants::INVALID_USERID) {
8767         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8768     }
8769 
8770     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8771     InnerBundleInfo innerBundleInfo;
8772 
8773     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8774     if (ret != ERR_OK) {
8775         LOG_D(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
8776         return ret;
8777     }
8778 
8779     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8780     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8781     if (!ability) {
8782         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8783             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8784         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8785     }
8786     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
8787 }
8788 
ExplicitQueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const8789 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
8790     int32_t appIndex, AbilityInfo &abilityInfo) const
8791 {
8792     std::string bundleName = element.GetBundleName();
8793     std::string abilityName = element.GetAbilityName();
8794     std::string moduleName = element.GetModuleName();
8795     LOG_D(BMS_TAG_QUERY,
8796         "ExplicitQueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8797         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8798     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
8799     int32_t requestUserId = GetUserId(userId);
8800     if (requestUserId == Constants::INVALID_USERID) {
8801         return false;
8802     }
8803     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8804     InnerBundleInfo innerBundleInfo;
8805 
8806     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8807     if (!ret) {
8808         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
8809         return false;
8810     }
8811 
8812     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8813     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
8814     if (!ability) {
8815         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8816             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8817         return false;
8818     }
8819     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
8820 }
8821 
ExplicitQueryCloneAbilityInfoV9(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const8822 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId,
8823     int32_t appIndex, AbilityInfo &abilityInfo) const
8824 {
8825     std::string bundleName = element.GetBundleName();
8826     std::string abilityName = element.GetAbilityName();
8827     std::string moduleName = element.GetModuleName();
8828     LOG_D(BMS_TAG_QUERY,
8829         "ExplicitQueryCloneAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8830         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8831     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
8832     int32_t requestUserId = GetUserId(userId);
8833     if (requestUserId == Constants::INVALID_USERID) {
8834         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8835     }
8836     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8837     InnerBundleInfo innerBundleInfo;
8838 
8839     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8840     if (ret != ERR_OK) {
8841         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
8842         return ret;
8843     }
8844 
8845     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8846     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8847     if (!ability) {
8848         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
8849             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
8850         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8851     }
8852     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
8853 }
8854 
GetCloneBundleInfo(const std::string & bundleName,int32_t flags,int32_t appIndex,BundleInfo & bundleInfo,int32_t userId) const8855 ErrCode BundleDataMgr::GetCloneBundleInfo(
8856     const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const
8857 {
8858     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
8859     if (userId == Constants::ANY_USERID) {
8860         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
8861             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
8862             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8863         }
8864         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
8865     }
8866 
8867     int32_t requestUserId = GetUserId(userId);
8868     if (requestUserId == Constants::INVALID_USERID) {
8869         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8870     }
8871     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8872     InnerBundleInfo innerBundleInfo;
8873 
8874     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
8875     if (ret != ERR_OK) {
8876         LOG_D(BMS_TAG_QUERY, "GetCloneBundleInfo failed, error code: %{public}d, bundleName:%{public}s",
8877             ret, bundleName.c_str());
8878         return ret;
8879     }
8880 
8881     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
8882     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
8883 
8884     ProcessBundleMenu(bundleInfo, flags, true);
8885     ProcessBundleRouterMap(bundleInfo, flags);
8886     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
8887         bundleName.c_str(), userId);
8888     return ERR_OK;
8889 }
8890 
QueryAllCloneExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const8891 void BundleDataMgr::QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId,
8892     std::vector<ExtensionAbilityInfo> &infos) const
8893 {
8894     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
8895     int32_t requestUserId = GetUserId(userId);
8896     if (requestUserId == Constants::INVALID_USERID) {
8897         LOG_D(BMS_TAG_QUERY, "invalid user");
8898         return;
8899     }
8900 
8901     ElementName element = want.GetElement();
8902     std::string bundleName = element.GetBundleName();
8903     std::string extensionName = element.GetAbilityName();
8904     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
8905         bundleName.c_str(), extensionName.c_str());
8906 
8907     if (!bundleName.empty() && !extensionName.empty()) {
8908         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
8909         if (cloneAppIndexes.empty()) {
8910             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
8911             return;
8912         }
8913         for (int32_t appIndex: cloneAppIndexes) {
8914             ExtensionAbilityInfo info;
8915             ErrCode ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
8916             if (ret != ERR_OK) {
8917                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
8918                 continue;
8919             }
8920             infos.emplace_back(info);
8921         }
8922         return;
8923     } else if (!bundleName.empty()) {
8924         ImplicitQueryCurCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
8925     } else {
8926         ImplicitQueryAllCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
8927     }
8928 }
8929 
QueryAllCloneExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const8930 void BundleDataMgr::QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
8931     std::vector<ExtensionAbilityInfo> &infos) const
8932 {
8933     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
8934     int32_t requestUserId = GetUserId(userId);
8935     if (requestUserId == Constants::INVALID_USERID) {
8936         LOG_D(BMS_TAG_QUERY, "invalid user");
8937         return;
8938     }
8939 
8940     ElementName element = want.GetElement();
8941     std::string bundleName = element.GetBundleName();
8942     std::string extensionName = element.GetAbilityName();
8943     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
8944         bundleName.c_str(), extensionName.c_str());
8945 
8946     if (!bundleName.empty() && !extensionName.empty()) {
8947         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
8948         if (cloneAppIndexes.empty()) {
8949             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
8950             return;
8951         }
8952         for (int32_t appIndex: cloneAppIndexes) {
8953             ExtensionAbilityInfo info;
8954             ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
8955             if (ret != ERR_OK) {
8956                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
8957                 continue;
8958             }
8959             infos.emplace_back(info);
8960         }
8961         return;
8962     } else if (!bundleName.empty()) {
8963         ImplicitQueryCurCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
8964     } else {
8965         ImplicitQueryAllCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
8966     }
8967 }
8968 
ImplicitQueryCurCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const8969 bool BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
8970     std::vector<ExtensionAbilityInfo> &abilityInfos) const
8971 {
8972     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfos");
8973     std::string bundleName = want.GetElement().GetBundleName();
8974 
8975     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8976     InnerBundleInfo innerBundleInfo;
8977     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId);
8978     if (!ret) {
8979         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfos failed");
8980         return false;
8981     }
8982     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
8983     if (cloneAppIndexes.empty()) {
8984         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfos empty");
8985         return true;
8986     }
8987     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8988     for (int32_t appIndex: cloneAppIndexes) {
8989         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
8990             LOG_D(BMS_TAG_QUERY,
8991                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
8992                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
8993             continue;
8994         }
8995         GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
8996     }
8997     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfos");
8998     return true;
8999 }
9000 
ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9001 ErrCode BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
9002     std::vector<ExtensionAbilityInfo> &abilityInfos) const
9003 {
9004     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfosV9");
9005     std::string bundleName = want.GetElement().GetBundleName();
9006 
9007     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9008     InnerBundleInfo innerBundleInfo;
9009     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
9010     if (ret != ERR_OK) {
9011         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfosV9 failed");
9012         return ret;
9013     }
9014     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
9015     if (cloneAppIndexes.empty()) {
9016         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfosV9 empty");
9017         return ERR_OK;
9018     }
9019     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9020     for (int32_t appIndex: cloneAppIndexes) {
9021         if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9022             LOG_D(BMS_TAG_QUERY,
9023                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9024                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9025             continue;
9026         }
9027         GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
9028     }
9029     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfosV9");
9030     return ERR_OK;
9031 }
9032 
ImplicitQueryAllCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9033 bool BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9034     std::vector<ExtensionAbilityInfo> &infos) const
9035 {
9036     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9037     for (const auto &item : bundleInfos_) {
9038         const InnerBundleInfo &innerBundleInfo = item.second;
9039         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
9040         if (cloneAppIndexes.empty()) {
9041             continue;
9042         }
9043         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9044         for (int32_t appIndex: cloneAppIndexes) {
9045             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9046                 LOG_D(BMS_TAG_QUERY,
9047                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9048                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9049                 continue;
9050             }
9051             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9052             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
9053         }
9054     }
9055     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
9056     return true;
9057 }
9058 
ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9059 ErrCode BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
9060     std::vector<ExtensionAbilityInfo> &infos) const
9061 {
9062     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9063     for (const auto &item : bundleInfos_) {
9064         const InnerBundleInfo &innerBundleInfo = item.second;
9065         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
9066         if (cloneAppIndexes.empty()) {
9067             continue;
9068         }
9069         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9070         for (int32_t appIndex: cloneAppIndexes) {
9071             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9072                 LOG_D(BMS_TAG_QUERY,
9073                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9074                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9075                 continue;
9076             }
9077             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9078             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
9079         }
9080     }
9081     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
9082     return ERR_OK;
9083 }
9084 
GetAppIdByBundleName(const std::string & bundleName,std::string & appId) const9085 ErrCode BundleDataMgr::GetAppIdByBundleName(
9086     const std::string &bundleName, std::string &appId) const
9087 {
9088     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
9089     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9090     auto item = bundleInfos_.find(bundleName);
9091     if (item == bundleInfos_.end()) {
9092         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9093     }
9094 
9095     appId = item->second.GetBaseBundleInfo().appId;
9096     return ERR_OK;
9097 }
9098 
GetSignatureInfoByBundleName(const std::string & bundleName,SignatureInfo & signatureInfo) const9099 ErrCode BundleDataMgr::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const
9100 {
9101     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9102     auto item = bundleInfos_.find(bundleName);
9103     if (item == bundleInfos_.end()) {
9104         LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
9105         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9106     }
9107     const InnerBundleInfo &innerBundleInfo = item->second;
9108     signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
9109     signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
9110     signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
9111     return ERR_OK;
9112 }
9113 
AddDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)9114 ErrCode BundleDataMgr::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
9115 {
9116     int32_t requestUserId = GetUserId(userId);
9117     if (requestUserId == Constants::INVALID_USERID) {
9118         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9119         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9120     }
9121     bool isEnabled = false;
9122     ErrCode ret = IsApplicationEnabled(shortcutInfo.bundleName, shortcutInfo.appIndex, isEnabled, userId);
9123     if (ret != ERR_OK) {
9124         APP_LOGD("IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
9125             ret, shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
9126         return ret;
9127     }
9128     if (!isEnabled) {
9129         APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
9130             shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
9131         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
9132     }
9133     bool isIdIllegal = false;
9134     if (!shortcutStorage_->AddDesktopShortcutInfo(shortcutInfo, userId, isIdIllegal)) {
9135         if (isIdIllegal) {
9136             return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
9137         }
9138         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9139     }
9140     return ERR_OK;
9141 }
9142 
DeleteDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)9143 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
9144 {
9145     int32_t requestUserId = GetUserId(userId);
9146     if (requestUserId == Constants::INVALID_USERID) {
9147         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9148         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9149     }
9150     if (!shortcutStorage_->DeleteDesktopShortcutInfo(shortcutInfo, userId)) {
9151         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9152     }
9153     return ERR_OK;
9154 }
9155 
GetAllDesktopShortcutInfo(int32_t userId,std::vector<ShortcutInfo> & shortcutInfos)9156 ErrCode BundleDataMgr::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
9157 {
9158     int32_t requestUserId = GetUserId(userId);
9159     if (requestUserId == Constants::INVALID_USERID) {
9160         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9161         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9162     }
9163     std::vector<ShortcutInfo> datas;
9164     shortcutStorage_->GetAllDesktopShortcutInfo(userId, datas);
9165     for (const auto &data : datas) {
9166         bool isEnabled = false;
9167         ErrCode ret = IsApplicationEnabled(data.bundleName, data.appIndex, isEnabled, userId);
9168         if (ret != ERR_OK) {
9169             APP_LOGD(
9170                 "IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
9171                 ret, data.bundleName.c_str(), data.appIndex, userId);
9172             continue;
9173         }
9174         if (!isEnabled) {
9175             APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
9176                 data.bundleName.c_str(), data.appIndex, userId);
9177             continue;
9178         }
9179         shortcutInfos.emplace_back(data);
9180     }
9181     return ERR_OK;
9182 }
9183 
DeleteDesktopShortcutInfo(const std::string & bundleName)9184 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName)
9185 {
9186     APP_LOGD("DeleteDesktopShortcutInfo by uninstall, bundleName:%{public}s", bundleName.c_str());
9187     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName)) {
9188         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9189     }
9190     return ERR_OK;
9191 }
9192 
DeleteDesktopShortcutInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)9193 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
9194 {
9195     APP_LOGD(
9196         "DeleteDesktopShortcutInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
9197         bundleName.c_str(), userId, appIndex);
9198     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName, userId, appIndex)) {
9199         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9200     }
9201     return ERR_OK;
9202 }
9203 
GetBundleInfosForContinuation(std::vector<BundleInfo> & bundleInfos) const9204 void BundleDataMgr::GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const
9205 {
9206     if (bundleInfos.empty()) {
9207         APP_LOGD("bundleInfos is empty");
9208         return;
9209     }
9210     bundleInfos.erase(std::remove_if(bundleInfos.begin(), bundleInfos.end(), [](BundleInfo bundleInfo) {
9211         for (auto abilityInfo : bundleInfo.abilityInfos) {
9212             if (abilityInfo.continuable) {
9213                 return false;
9214             }
9215         }
9216         return true;
9217         }), bundleInfos.end());
9218 }
9219 
GetContinueBundleNames(const std::string & continueBundleName,std::vector<std::string> & bundleNames,int32_t userId)9220 ErrCode BundleDataMgr::GetContinueBundleNames(
9221     const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
9222 {
9223     auto requestUserId = GetUserId(userId);
9224     if (requestUserId == Constants::INVALID_USERID) {
9225         APP_LOGE("Input invalid userid, userId:%{public}d", userId);
9226         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9227     }
9228     if (continueBundleName.empty()) {
9229         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
9230     }
9231 
9232     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9233     for (const auto &[key, innerInfo] : bundleInfos_) {
9234         if (CheckInnerBundleInfoWithFlags(
9235             innerInfo, BundleFlag::GET_BUNDLE_WITH_ABILITIES, innerInfo.GetResponseUserId(requestUserId)) != ERR_OK) {
9236             continue;
9237         }
9238         for (const auto &[key, abilityInfo] : innerInfo.GetInnerAbilityInfos()) {
9239             if (abilityInfo.continueBundleNames.find(continueBundleName) != abilityInfo.continueBundleNames.end()) {
9240                 bundleNames.emplace_back(abilityInfo.bundleName);
9241                 break;
9242             }
9243         }
9244     }
9245 
9246     APP_LOGD("The number of found continue packs, size:[%{public}d]", static_cast<int32_t>(bundleNames.size()));
9247     return ERR_OK;
9248 }
9249 
IsBundleInstalled(const std::string & bundleName,int32_t userId,int32_t appIndex,bool & isInstalled)9250 ErrCode BundleDataMgr::IsBundleInstalled(const std::string &bundleName, int32_t userId,
9251     int32_t appIndex, bool &isInstalled)
9252 {
9253     int32_t requestUserId = GetUserId(userId);
9254     if (requestUserId == Constants::INVALID_USERID) {
9255         APP_LOGE("name %{public}s invalid userid :%{public}d", bundleName.c_str(), userId);
9256         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9257     }
9258     if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
9259         APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
9260         return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX;
9261     }
9262     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9263     auto item = bundleInfos_.find(bundleName);
9264     if (item == bundleInfos_.end()) {
9265         isInstalled = false;
9266         return ERR_OK;
9267     }
9268     if (item->second.GetInstallMark().status == InstallExceptionStatus::INSTALL_START) {
9269         APP_LOGW("name %{public}s is installing", bundleName.c_str());
9270         isInstalled = false;
9271         return ERR_OK;
9272     }
9273     if ((item->second.GetApplicationBundleType() == BundleType::SHARED) ||
9274         ((item->second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) &&
9275         item->second.GetInnerBundleUserInfos().empty())) {
9276         isInstalled = true;
9277         return ERR_OK;
9278     }
9279     int32_t responseUserId = item->second.GetResponseUserId(requestUserId);
9280     if (responseUserId == Constants::INVALID_USERID) {
9281         isInstalled = false;
9282         return ERR_OK;
9283     }
9284     if (appIndex == 0) {
9285         isInstalled = true;
9286         return ERR_OK;
9287     }
9288     InnerBundleUserInfo innerBundleUserInfo;
9289     if (item->second.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
9290         if (innerBundleUserInfo.cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) !=
9291             innerBundleUserInfo.cloneInfos.end()) {
9292             isInstalled = true;
9293             return ERR_OK;
9294         }
9295     }
9296     isInstalled = false;
9297     return ERR_OK;
9298 }
9299 
UpdateIsPreInstallApp(const std::string & bundleName,bool isPreInstallApp)9300 void BundleDataMgr::UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)
9301 {
9302     APP_LOGD("UpdateIsPreInstallApp %{public}s", bundleName.c_str());
9303     if (bundleName.empty()) {
9304         APP_LOGW("bundleName is empty");
9305         return;
9306     }
9307 
9308     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9309     auto infoItem = bundleInfos_.find(bundleName);
9310     if (infoItem == bundleInfos_.end()) {
9311         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
9312         return;
9313     }
9314 
9315     if (infoItem->second.IsPreInstallApp() != isPreInstallApp) {
9316         infoItem->second.SetIsPreInstallApp(isPreInstallApp);
9317         SaveInnerBundleInfo(infoItem->second);
9318     }
9319 }
9320 
GetDirForAtomicService(const std::string & bundleName,std::string & dataDir) const9321 ErrCode BundleDataMgr::GetDirForAtomicService(const std::string &bundleName, std::string &dataDir) const
9322 {
9323     APP_LOGD("start GetDirForAtomicService name: %{public}s", bundleName.c_str());
9324     AccountSA::OhosAccountInfo accountInfo;
9325     auto ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfo(accountInfo);
9326     if (ret != ERR_OK) {
9327         APP_LOGE("GetOhosAccountInfo failed, errCode: %{public}d", ret);
9328         return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
9329     }
9330     dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
9331     return ERR_OK;
9332 }
9333 
GetBundleNameByAppId(const std::string & appId,std::string & bundleName)9334 ErrCode BundleDataMgr::GetBundleNameByAppId(const std::string &appId, std::string &bundleName)
9335 {
9336     APP_LOGD("start GetBundleNameByAppId %{private}s", appId.c_str());
9337     if (appId.empty()) {
9338         APP_LOGW("appId is empty");
9339         return ERR_APPEXECFWK_INSTALL_PARAM_ERROR;
9340     }
9341     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9342     for (const auto &[key, innerInfo] : bundleInfos_) {
9343         if (innerInfo.GetAppId() == appId || innerInfo.GetAppIdentifier() == appId) {
9344             bundleName = key;
9345             return ERR_OK;
9346         }
9347     }
9348     APP_LOGI("get bundleName failed %{private}s", appId.c_str());
9349     return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9350 }
9351 
GetDirForAtomicServiceByUserId(const std::string & bundleName,int32_t userId,AccountSA::OhosAccountInfo & accountInfo,std::string & dataDir) const9352 ErrCode BundleDataMgr::GetDirForAtomicServiceByUserId(const std::string &bundleName, int32_t userId,
9353     AccountSA::OhosAccountInfo &accountInfo, std::string &dataDir) const
9354 {
9355     APP_LOGD("start GetDirForAtomicServiceByUserId name: %{public}s userId: %{public}d", bundleName.c_str(), userId);
9356     if (accountInfo.uid_.empty()) {
9357         auto ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfoByUserId(userId, accountInfo);
9358         if (ret != ERR_OK) {
9359             APP_LOGE("GetOsAccountDistributedInfo failed, errCode: %{public}d", ret);
9360             return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
9361         }
9362     }
9363     dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
9364     return ERR_OK;
9365 }
9366 
GetDirForApp(const std::string & bundleName,const int32_t appIndex) const9367 std::string BundleDataMgr::GetDirForApp(const std::string &bundleName, const int32_t appIndex) const
9368 {
9369     APP_LOGD("start GetDirForApp name: %{public}s appIndex: %{public}d", bundleName.c_str(), appIndex);
9370     if (appIndex == 0) {
9371         return bundleName;
9372     } else {
9373         return CLONE_APP_DIR_PREFIX + std::to_string(appIndex) + PLUS + bundleName;
9374     }
9375 }
9376 
GetDirByBundleNameAndAppIndex(const std::string & bundleName,const int32_t appIndex,std::string & dataDir) const9377 ErrCode BundleDataMgr::GetDirByBundleNameAndAppIndex(const std::string &bundleName, const int32_t appIndex,
9378     std::string &dataDir) const
9379 {
9380     APP_LOGD("start GetDir bundleName : %{public}s appIndex : %{public}d", bundleName.c_str(), appIndex);
9381     if (appIndex < 0) {
9382         return ERR_BUNDLE_MANAGER_GET_DIR_INVALID_APP_INDEX;
9383     }
9384     BundleType type = BundleType::APP;
9385     GetBundleType(bundleName, type);
9386     if (type == BundleType::ATOMIC_SERVICE) {
9387         return GetDirForAtomicService(bundleName, dataDir);
9388     }
9389     dataDir = GetDirForApp(bundleName, appIndex);
9390     return ERR_OK;
9391 }
9392 
GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,int32_t userId) const9393 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo &innerBundleInfo,
9394     int32_t userId) const
9395 {
9396     std::vector<int32_t> cloneAppIndexes;
9397     InnerBundleUserInfo innerBundleUserInfo;
9398     if (!innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
9399         return cloneAppIndexes;
9400     }
9401     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
9402     if (cloneInfos.empty()) {
9403         return cloneAppIndexes;
9404     }
9405     for (const auto &cloneInfo : cloneInfos) {
9406         LOG_D(BMS_TAG_QUERY, "get cloneAppIndexes by inner bundle info: %{public}d", cloneInfo.second.appIndex);
9407         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
9408     }
9409     return cloneAppIndexes;
9410 }
9411 
GetBundleDir(int32_t userId,BundleType type,AccountSA::OhosAccountInfo & accountInfo,BundleDir & bundleDir) const9412 ErrCode BundleDataMgr::GetBundleDir(int32_t userId, BundleType type, AccountSA::OhosAccountInfo &accountInfo,
9413     BundleDir &bundleDir) const
9414 {
9415     APP_LOGD("start GetBundleDir");
9416     if (type == BundleType::ATOMIC_SERVICE) {
9417         std::string dataDir;
9418         auto ret = GetDirForAtomicServiceByUserId(bundleDir.bundleName, userId, accountInfo, dataDir);
9419         if (ret != ERR_OK) {
9420             return ret;
9421         }
9422         bundleDir.dir = dataDir;
9423     } else {
9424         bundleDir.dir = GetDirForApp(bundleDir.bundleName, bundleDir.appIndex);
9425     }
9426     return ERR_OK;
9427 }
9428 
GetAllBundleDirs(int32_t userId,std::vector<BundleDir> & bundleDirs) const9429 ErrCode BundleDataMgr::GetAllBundleDirs(int32_t userId, std::vector<BundleDir> &bundleDirs) const
9430 {
9431     APP_LOGD("start GetAllBundleDirs");
9432     int32_t requestUserId = GetUserId(userId);
9433     if (requestUserId == Constants::INVALID_USERID) {
9434         APP_LOGE("invalid userid :%{public}d", userId);
9435         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9436     }
9437     AccountSA::OhosAccountInfo accountInfo;
9438     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9439     for (const auto &item : bundleInfos_) {
9440         const InnerBundleInfo &info = item.second;
9441         std::string bundleName = info.GetBundleName();
9442         int32_t responseUserId = info.GetResponseUserId(requestUserId);
9443         if (responseUserId == Constants::INVALID_USERID) {
9444             APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
9445             continue;
9446         }
9447         BundleType type = info.GetApplicationBundleType();
9448         if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
9449             continue;
9450         }
9451 
9452         std::vector<int32_t> allAppIndexes = {0};
9453         if (type == BundleType::APP) {
9454             std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
9455             allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
9456         }
9457         for (int32_t appIndex: allAppIndexes) {
9458             BundleDir bundleDir;
9459             bundleDir.bundleName = bundleName;
9460             bundleDir.appIndex = appIndex;
9461             auto ret = GetBundleDir(responseUserId, type, accountInfo, bundleDir);
9462             if (ret != ERR_OK) {
9463                 return ret;
9464             }
9465             bundleDirs.emplace_back(bundleDir);
9466         }
9467     }
9468     return ERR_OK;
9469 }
9470 }  // namespace AppExecFwk
9471 }  // namespace OHOS
9472