• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bundle_data_mgr.h"
17 
18 #include <sys/stat.h>
19 #include <tuple>
20 
21 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
22 #ifdef ACCOUNT_ENABLE
23 #include "os_account_info.h"
24 #endif
25 #endif
26 #include "ability_manager_helper.h"
27 #include "accesstoken_kit.h"
28 #include "account_helper.h"
29 #include "app_log_tag_wrapper.h"
30 #include "app_provision_info_manager.h"
31 #include "bms_extension_client.h"
32 #include "bundle_common_event_mgr.h"
33 #include "bundle_data_storage_rdb.h"
34 #include "preinstall_data_storage_rdb.h"
35 #include "hap_token_info.h"
36 #include "bundle_event_callback_death_recipient.h"
37 #include "bundle_mgr_service.h"
38 #include "bundle_mgr_client.h"
39 #include "bundle_parser.h"
40 #include "bundle_permission_mgr.h"
41 #include "bundle_status_callback_death_recipient.h"
42 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
43 #include "default_app_mgr.h"
44 #endif
45 #include "hitrace_meter.h"
46 #include "inner_bundle_clone_common.h"
47 #include "installd_client.h"
48 #include "interfaces/hap_verify.h"
49 #include "ipc_skeleton.h"
50 #ifdef GLOBAL_I18_ENABLE
51 #include "locale_config.h"
52 #include "locale_info.h"
53 #endif
54 #include "mime_type_mgr.h"
55 #include "parameters.h"
56 #include "router_map_helper.h"
57 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
58 #include "bundle_overlay_data_manager.h"
59 #endif
60 #include "bundle_extractor.h"
61 #include "parameter.h"
62 #include "scope_guard.h"
63 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
64 #include "type_descriptor.h"
65 #include "utd_client.h"
66 #endif
67 
68 #ifdef APP_DOMAIN_VERIFY_ENABLED
69 #include "app_domain_verify_mgr_client.h"
70 #endif
71 
72 #include "router_data_storage_rdb.h"
73 #include "shortcut_data_storage_rdb.h"
74 #include "system_ability_helper.h"
75 #include "ohos_account_kits.h"
76 #include "xcollie_helper.h"
77 
78 namespace OHOS {
79 namespace AppExecFwk {
80 namespace {
81 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
82 constexpr int8_t DATA_GROUP_INDEX_START = 1;
83 constexpr int8_t UUID_LENGTH = 36;
84 constexpr int8_t PROFILE_PREFIX_LENGTH = 9;
85 constexpr uint16_t UUID_LENGTH_MAX = 512;
86 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
87 // freeInstall action
88 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
89 // share action
90 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
91 constexpr const char* WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
92 constexpr const char* SUMMARY_TOTAL_COUNT = "totalCount";
93 constexpr const char* WANT_PARAM_SUMMARY = "summary";
94 constexpr int8_t DEFAULT_SUMMARY_COUNT = 0;
95 // data share
96 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
97 constexpr int8_t DATA_PROXY_URI_PREFIX_LEN = 17;
98 // profile path
99 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
100 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
101 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
102 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
103 constexpr const char* PKG_CONTEXT_PROFILE_PATH = "pkgContextInfo.json";
104 constexpr const char* FILE_ICON_PROFILE_PATH = "resources/base/profile/file_icon.json";
105 constexpr const char* INSIGHT_INTENT_PROFILE_PATH = "resources/base/profile/extract_insight_intent.json";
106 constexpr const char* PROFILE_PATH = "resources/base/profile/";
107 constexpr const char* PROFILE_PREFIX = "$profile:";
108 constexpr const char* JSON_SUFFIX = ".json";
109 constexpr const char* SCHEME_HTTPS = "https";
110 constexpr const char* META_DATA_SHORTCUTS_NAME = "ohos.ability.shortcuts";
111 constexpr const char* BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
112 constexpr const char* ENTRY = "entry";
113 constexpr const char* CLONE_BUNDLE_PREFIX = "clone_";
114 constexpr const char* RESOURCE_STRING_PREFIX = "$string:";
115 
116 const std::map<ProfileType, const char*> PROFILE_TYPE_MAP = {
117     { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
118     { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
119     { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
120     { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH },
121     { ProfileType::PKG_CONTEXT_PROFILE, PKG_CONTEXT_PROFILE_PATH },
122     { ProfileType::FILE_ICON_PROFILE, FILE_ICON_PROFILE_PATH },
123     { ProfileType::INSIGHT_INTENT_PROFILE, INSIGHT_INTENT_PROFILE_PATH },
124     { ProfileType::CLOUD_PROFILE, ServiceConstants::CLOUD_PROFILE_PATH}
125 };
126 const std::string SCHEME_END = "://";
127 const std::string LINK_FEATURE = "linkFeature";
128 const std::string ATOMIC_SERVICE_DIR_PREFIX = "+auid-";
129 const std::string CLONE_APP_DIR_PREFIX = "+clone-";
130 const std::string PLUS = "+";
131 constexpr const char* PARAM_URI_SEPARATOR = ":///";
132 constexpr const char* URI_SEPARATOR = "://";
133 constexpr uint8_t PARAM_URI_SEPARATOR_LEN = 4;
134 constexpr int8_t INVALID_BUNDLEID = -1;
135 constexpr int32_t DATA_GROUP_UID_OFFSET = 100000;
136 constexpr int32_t MAX_APP_UID = 65535;
137 constexpr int8_t ONLY_ONE_USER = 1;
138 constexpr unsigned int OTA_CODE_ENCRYPTION_TIMEOUT = 4 * 60;
139 const std::string FUNCATION_HANDLE_OTA_CODE_ENCRYPTION = "BundleDataMgr::HandleOTACodeEncryption()";
140 const std::string BUNDLE_NAME = "BUNDLE_NAME";
141 const std::string USER_ID = "USER_ID";
142 const std::string APP_INDEX = "APP_INDEX";
143 #ifndef BUNDLE_FRAMEWORK_FREE_INSTALL
144 constexpr int APP_MGR_SERVICE_ID = 501;
145 #endif
146 }
147 
BundleDataMgr()148 BundleDataMgr::BundleDataMgr()
149 {
150     InitStateTransferMap();
151     dataStorage_ = std::make_shared<BundleDataStorageRdb>();
152     preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
153     sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
154     bundleStateStorage_ = std::make_shared<BundleStateStorage>();
155     shortcutStorage_ = std::make_shared<ShortcutDataStorageRdb>();
156     shortcutVisibleStorage_ = std::make_shared<ShortcutVisibleDataStorageRdb>();
157     routerStorage_ = std::make_shared<RouterDataStorageRdb>();
158     uninstallDataMgr_ = std::make_shared<UninstallDataMgrStorageRdb>();
159     firstInstallDataMgr_ = std::make_shared<FirstInstallDataMgrStorageRdb>();
160     baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
161     if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) {
162         baseAppUid_ = Constants::BASE_APP_UID;
163     }
164     APP_LOGI("BundleDataMgr instance is created");
165 }
166 
~BundleDataMgr()167 BundleDataMgr::~BundleDataMgr()
168 {
169     APP_LOGI("BundleDataMgr instance is destroyed");
170     installStates_.clear();
171     transferStates_.clear();
172     bundleInfos_.clear();
173 }
174 
LoadDataFromPersistentStorage()175 bool BundleDataMgr::LoadDataFromPersistentStorage()
176 {
177     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
178     // Judge whether bundleState json db exists.
179     // If it does not exist, create it and return the judgment result.
180     bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
181     if (!dataStorage_->LoadAllData(bundleInfos_)) {
182         APP_LOGW("LoadAllData failed");
183         return false;
184     }
185 
186     if (bundleInfos_.empty()) {
187         APP_LOGW("persistent data is empty");
188         return false;
189     }
190 
191     for (const auto &item : bundleInfos_) {
192         std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
193         installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
194         AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
195     }
196 
197     RestoreUidAndGid();
198     if (!bundleStateDbExist) {
199         // Compatible old bundle status in kV db
200         CompatibleOldBundleStateInKvDb();
201     } else {
202         ResetBundleStateData();
203         // Load all bundle status from json db.
204         LoadAllBundleStateDataFromJsonDb();
205     }
206 
207     SetInitialUserFlag(true);
208 
209     RestoreSandboxUidAndGid(bundleIdMap_);
210     return true;
211 }
212 
CompatibleOldBundleStateInKvDb()213 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
214 {
215     for (const auto& bundleInfoItem : bundleInfos_) {
216         for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
217             auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
218             if (bundleUserInfo.IsInitialState()) {
219                 continue;
220             }
221 
222             // save old bundle state to json db
223             bundleStateStorage_->SaveBundleStateStorage(
224                 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
225         }
226     }
227 }
228 
LoadAllBundleStateDataFromJsonDb()229 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
230 {
231     APP_LOGD("Load all bundle state start");
232     std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
233     if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
234         APP_LOGW("Load all bundle state failed");
235         return;
236     }
237 
238     for (const auto& bundleState : bundleStateInfos) {
239         auto infoItem = bundleInfos_.find(bundleState.first);
240         if (infoItem == bundleInfos_.end()) {
241             APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
242             continue;
243         }
244 
245         InnerBundleInfo& newInfo = infoItem->second;
246         for (auto& bundleUserState : bundleState.second) {
247             auto& tempUserInfo = bundleUserState.second;
248             newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.second.setEnabledCaller,
249                 bundleUserState.first);
250             for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
251                 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
252             }
253         }
254     }
255 
256     APP_LOGD("Load all bundle state end");
257 }
258 
ResetBundleStateData()259 void BundleDataMgr::ResetBundleStateData()
260 {
261     for (auto& bundleInfoItem : bundleInfos_) {
262         bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
263     }
264 }
265 
UpdateBundleInstallState(const std::string & bundleName,const InstallState state,const bool isKeepData)266 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName,
267     const InstallState state, const bool isKeepData)
268 {
269     if (bundleName.empty()) {
270         APP_LOGW("update failed: bundle name is empty");
271         return false;
272     }
273 
274     // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
275     std::unique_lock<ffrt::shared_mutex> lck(bundleInfoMutex_);
276     std::lock_guard<ffrt::mutex> lock(stateMutex_);
277     auto item = installStates_.find(bundleName);
278     if (item == installStates_.end()) {
279         if (state == InstallState::INSTALL_START) {
280             installStates_.emplace(bundleName, state);
281             APP_LOGD("update succeed");
282             return true;
283         }
284         APP_LOGW("update failed: incorrect state, -n: %{public}s", bundleName.c_str());
285         return false;
286     }
287 
288     auto stateRange = transferStates_.equal_range(state);
289     for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
290         if (item->second == previousState->second) {
291             APP_LOGD("update succeed, current:%{public}d, state:%{public}d",
292                 static_cast<int32_t>(previousState->second), static_cast<int32_t>(state));
293             if (IsDeleteDataState(state)) {
294                 installStates_.erase(item);
295                 DeleteBundleInfo(bundleName, state, isKeepData);
296                 return true;
297             }
298             item->second = state;
299             return true;
300         }
301     }
302     APP_LOGW_NOFUNC("UpdateBundleInstallState -n %{public}s fail current:%{public}d state:%{public}d",
303         bundleName.c_str(), static_cast<int32_t>(item->second), static_cast<int32_t>(state));
304     return false;
305 }
306 
AddInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info,bool checkStatus)307 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info, bool checkStatus)
308 {
309     APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
310     if (bundleName.empty()) {
311         APP_LOGW("save info fail, empty bundle name");
312         return false;
313     }
314 
315     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
316     auto infoItem = bundleInfos_.find(bundleName);
317     if (infoItem != bundleInfos_.end()) {
318         APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
319         return false;
320     }
321     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
322     auto statusItem = installStates_.find(bundleName);
323     if (statusItem == installStates_.end()) {
324         APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
325         return false;
326     }
327     if (!checkStatus || statusItem->second == InstallState::INSTALL_START) {
328         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
329         if (info.GetBaseApplicationInfo().needAppDetail) {
330             AddAppDetailAbilityInfo(info);
331         }
332 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
333         if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
334             InnerBundleInfo newInfo = info;
335             std::string targetBundleName = newInfo.GetTargetBundleName();
336             auto targetInfoItem = bundleInfos_.find(targetBundleName);
337             if (targetInfoItem != bundleInfos_.end()) {
338                 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
339                 // storage target bundle info
340                 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
341             }
342         }
343         if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
344             int32_t overlayModuleState = OverlayState::OVERLAY_INVALID;
345             (void)info.GetOverlayModuleState(info.GetCurrentModulePackage(), info.GetUserId(), overlayModuleState);
346             info.SetOverlayModuleState(info.GetCurrentModulePackage(), overlayModuleState, info.GetUserId());
347         }
348         if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
349             // build overlay connection for external overlay
350             BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
351         }
352 #endif
353         bundleInfos_.emplace(bundleName, info);
354         AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
355         return true;
356     }
357     return false;
358 }
359 
AddNewModuleInfo(const std::string & bundleName,const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)360 bool BundleDataMgr::AddNewModuleInfo(
361     const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
362 {
363     LOG_I(BMS_TAG_DEFAULT, "addInfo:%{public}s", newInfo.GetCurrentModulePackage().c_str());
364     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
365     auto infoItem = bundleInfos_.find(bundleName);
366     if (infoItem == bundleInfos_.end()) {
367         APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
368         return false;
369     }
370     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
371     auto statusItem = installStates_.find(bundleName);
372     if (statusItem == installStates_.end()) {
373         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
374         return false;
375     }
376     if (statusItem->second == InstallState::UPDATING_SUCCESS) {
377         if (AddNewModuleInfo(newInfo, oldInfo)) {
378             bundleInfos_.at(bundleName) = oldInfo;
379             return true;
380         }
381     }
382     return false;
383 }
384 
UpdateBaseBundleInfoIntoOld(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)385 void BundleDataMgr::UpdateBaseBundleInfoIntoOld(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
386 {
387     oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
388     oldInfo.UpdateBaseApplicationInfo(newInfo);
389     oldInfo.UpdateRemovable(newInfo.IsPreInstallApp(), newInfo.IsRemovable());
390     oldInfo.UpdateMultiAppMode(newInfo);
391     oldInfo.UpdateReleaseType(newInfo);
392     oldInfo.SetAppType(newInfo.GetAppType());
393     oldInfo.SetAppFeature(newInfo.GetAppFeature());
394 }
395 
AddNewModuleInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)396 bool BundleDataMgr::AddNewModuleInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
397 {
398     APP_LOGD("save bundle:%{public}s info", oldInfo.GetBundleName().c_str());
399     ProcessAllowedAcls(newInfo, oldInfo);
400     if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
401         UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
402     }
403     if (oldInfo.GetOldAppIds().empty()) {
404         oldInfo.AddOldAppId(oldInfo.GetAppId());
405     }
406     oldInfo.SetProvisionId(newInfo.GetProvisionId());
407     oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
408     oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
409     oldInfo.AddOldAppId(newInfo.GetAppId());
410     oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
411     oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
412     oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
413     oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
414     oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
415     oldInfo.AddModuleInfo(newInfo);
416     oldInfo.UpdateAppDetailAbilityAttrs();
417     if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
418         AddAppDetailAbilityInfo(oldInfo);
419     }
420     oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
421     oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
422     oldInfo.UpdateOdidByBundleInfo(newInfo);
423     oldInfo.SetDFXParamStatus();
424     oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
425 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
426     if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
427         oldInfo.SetOverlayType(newInfo.GetOverlayType());
428     }
429     if (!UpdateOverlayInfo(newInfo, oldInfo)) {
430         APP_LOGD("bundleName: %{public}s : update overlay info failed", oldInfo.GetBundleName().c_str());
431         return false;
432     }
433 #endif
434     APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
435     return true;
436 }
437 
RemoveModuleInfo(const std::string & bundleName,const std::string & modulePackage,InnerBundleInfo & oldInfo,bool needSaveStorage)438 bool BundleDataMgr::RemoveModuleInfo(
439     const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo, bool needSaveStorage)
440 {
441     APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
442     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
443     auto infoItem = bundleInfos_.find(bundleName);
444     if (infoItem == bundleInfos_.end()) {
445         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
446         return false;
447     }
448     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
449     auto statusItem = installStates_.find(bundleName);
450     if (statusItem == installStates_.end()) {
451         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
452         return false;
453     }
454     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
455         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
456 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
457         std::string targetBundleName = oldInfo.GetTargetBundleName();
458         InnerBundleInfo targetInnerBundleInfo;
459         if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
460             targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
461         }
462         OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
463             targetInnerBundleInfo);
464         if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
465             // save target innerBundleInfo
466             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
467                 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
468                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
469             }
470         }
471         // remove target module and overlay module state will change to OVERLAY_INVALID
472         if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
473             ResetExternalOverlayModuleState(bundleName, modulePackage);
474         }
475 #endif
476         oldInfo.RemoveModuleInfo(modulePackage);
477         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
478         if (!oldInfo.isExistedOverlayModule()) {
479             oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
480         }
481         oldInfo.SetDFXParamStatus();
482         if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(oldInfo)) {
483             APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
484             return false;
485         }
486         DeleteRouterInfo(bundleName, modulePackage);
487         bundleInfos_.at(bundleName) = oldInfo;
488         APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
489     }
490     return true;
491 }
492 
UpdateUninstallBundleInfo(const std::string & bundleName,const UninstallBundleInfo & uninstallBundleInfo)493 bool BundleDataMgr::UpdateUninstallBundleInfo(const std::string &bundleName,
494     const UninstallBundleInfo &uninstallBundleInfo)
495 {
496     if (uninstallDataMgr_ == nullptr) {
497         APP_LOGE("rdbDataManager is null");
498         return false;
499     }
500     if (bundleName.empty() || uninstallBundleInfo.userInfos.empty()) {
501         APP_LOGE("param error");
502         return false;
503     }
504     UninstallBundleInfo oldUninstallBundleInfo;
505     if (uninstallDataMgr_->GetUninstallBundleInfo(bundleName, oldUninstallBundleInfo)) {
506         std::string newUser = uninstallBundleInfo.userInfos.begin()->first;
507         if (oldUninstallBundleInfo.userInfos.find(newUser) != oldUninstallBundleInfo.userInfos.end()) {
508             APP_LOGE("u %{public}s has been saved", newUser.c_str());
509             return false;
510         }
511         oldUninstallBundleInfo.userInfos[newUser] = uninstallBundleInfo.userInfos.begin()->second;
512         return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, oldUninstallBundleInfo);
513     }
514     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
515 }
516 
GetUninstallBundleInfo(const std::string & bundleName,UninstallBundleInfo & uninstallBundleInfo)517 bool BundleDataMgr::GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)
518 {
519     if (uninstallDataMgr_ == nullptr) {
520         APP_LOGE("rdbDataManager is null");
521         return false;
522     }
523     if (bundleName.empty()) {
524         APP_LOGE("param error");
525         return false;
526     }
527     return uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo);
528 }
529 
GetAllUninstallBundleInfo(std::map<std::string,UninstallBundleInfo> & uninstallBundleInfos)530 bool BundleDataMgr::GetAllUninstallBundleInfo(
531     std::map<std::string, UninstallBundleInfo> &uninstallBundleInfos)
532 {
533     if (uninstallDataMgr_ == nullptr) {
534         APP_LOGE("rdbDataManager is null");
535         return false;
536     }
537     return uninstallDataMgr_->GetAllUninstallBundleInfo(uninstallBundleInfos);
538 }
539 
DeleteUninstallBundleInfo(const std::string & bundleName,int32_t userId)540 bool BundleDataMgr::DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)
541 {
542     if (uninstallDataMgr_ == nullptr) {
543         APP_LOGE("rdbDataManager is null");
544         return false;
545     }
546     if (bundleName.empty()) {
547         APP_LOGE("param error");
548         return false;
549     }
550     UninstallBundleInfo uninstallBundleInfo;
551     if (!uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo)) {
552         APP_LOGE("bundle %{public}s is not found", bundleName.c_str());
553         return false;
554     }
555     auto it = uninstallBundleInfo.userInfos.find(std::to_string(userId));
556     if (it == uninstallBundleInfo.userInfos.end()) {
557         APP_LOGE("user %{public}d is not found", userId);
558         return false;
559     }
560     uninstallBundleInfo.userInfos.erase(std::to_string(userId));
561     if (uninstallBundleInfo.userInfos.empty()) {
562         return uninstallDataMgr_->DeleteUninstallBundleInfo(bundleName);
563     }
564     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
565 }
566 
AddFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,const FirstInstallBundleInfo & firstInstallBundleInfo)567 bool BundleDataMgr::AddFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
568     const FirstInstallBundleInfo &firstInstallBundleInfo)
569 {
570     if (bundleName.empty()) {
571         APP_LOGE("bundleName is empty");
572         return false;
573     }
574     if (firstInstallDataMgr_ == nullptr) {
575         APP_LOGE("firstInstallDataMgr_ is null");
576         return false;
577     }
578 
579     if (firstInstallDataMgr_->IsExistFirstInstallBundleInfo(bundleName, userId)) {
580         APP_LOGW("bundleName %{public}s, user %{public}d has been saved", bundleName.c_str(), userId);
581         return true;
582     }
583     return firstInstallDataMgr_->AddFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
584 }
585 
GetFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,FirstInstallBundleInfo & firstInstallBundleInfo)586 bool BundleDataMgr::GetFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
587     FirstInstallBundleInfo &firstInstallBundleInfo)
588 {
589     if (bundleName.empty()) {
590         APP_LOGE("bundleName is empty");
591         return false;
592     }
593     if (firstInstallDataMgr_ == nullptr) {
594         APP_LOGE("firstInstallDataMgr_ is null");
595         return false;
596     }
597     return firstInstallDataMgr_->GetFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
598 }
599 
DeleteFirstInstallBundleInfo(int32_t userId)600 bool BundleDataMgr::DeleteFirstInstallBundleInfo(int32_t userId)
601 {
602     if (firstInstallDataMgr_ == nullptr) {
603         APP_LOGE("firstInstallDataMgr_ is null");
604         return false;
605     }
606     return firstInstallDataMgr_->DeleteFirstInstallBundleInfo(userId);
607 }
608 
RemoveHspModuleByVersionCode(int32_t versionCode,InnerBundleInfo & info)609 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
610 {
611     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
612     std::string bundleName = info.GetBundleName();
613     auto infoItem = bundleInfos_.find(bundleName);
614     if (infoItem == bundleInfos_.end()) {
615         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
616         return false;
617     }
618     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
619     auto statusItem = installStates_.find(bundleName);
620     if (statusItem == installStates_.end()) {
621         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
622         return false;
623     }
624     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
625         info.DeleteHspModuleByVersion(versionCode);
626         info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
627         if (dataStorage_->SaveStorageBundleInfo(info)) {
628             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
629             bundleInfos_.at(bundleName) = info;
630             return true;
631         }
632     }
633     return true;
634 }
635 
AddInnerBundleUserInfo(const std::string & bundleName,const InnerBundleUserInfo & newUserInfo)636 ErrCode BundleDataMgr::AddInnerBundleUserInfo(
637     const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
638 {
639     APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
640     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
641     auto infoItem = bundleInfos_.find(bundleName);
642     if (infoItem == bundleInfos_.end()) {
643         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
644         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
645     }
646 
647     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
648     auto& info = bundleInfos_.at(bundleName);
649     info.AddInnerBundleUserInfo(newUserInfo);
650     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
651     ErrCode ret = dataStorage_->SaveStorageBundleInfoWithCode(info);
652     if (ret != ERR_OK) {
653         APP_LOGW("update storage failed bundle:%{public}s, errcode:%{public}d", bundleName.c_str(), ret);
654         return ret;
655     }
656     return ERR_OK;
657 }
658 
RemoveInnerBundleUserInfo(const std::string & bundleName,int32_t userId)659 bool BundleDataMgr::RemoveInnerBundleUserInfo(
660     const std::string &bundleName, int32_t userId)
661 {
662     APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
663     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
664     auto infoItem = bundleInfos_.find(bundleName);
665     if (infoItem == bundleInfos_.end()) {
666         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
667         return false;
668     }
669 
670     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
671     auto& info = bundleInfos_.at(bundleName);
672     info.RemoveInnerBundleUserInfo(userId);
673     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
674     if (!dataStorage_->SaveStorageBundleInfo(info)) {
675         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
676         return false;
677     }
678 
679     bundleStateStorage_->DeleteBundleState(bundleName, userId);
680     return true;
681 }
682 
UpdateInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)683 bool BundleDataMgr::UpdateInnerBundleInfo(
684     const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
685 {
686     LOG_I(BMS_TAG_DEFAULT, "updateInfo:%{public}s", bundleName.c_str());
687     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
688     auto infoItem = bundleInfos_.find(bundleName);
689     if (infoItem == bundleInfos_.end()) {
690         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
691         return false;
692     }
693     std::lock_guard<ffrt::mutex> stateLock(stateMutex_);
694     auto statusItem = installStates_.find(bundleName);
695     if (statusItem == installStates_.end()) {
696         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
697         return false;
698     }
699     // ROLL_BACK and USER_CHANGE should not be here
700     if (statusItem->second == InstallState::UPDATING_SUCCESS
701         || statusItem->second == InstallState::ROLL_BACK
702         || statusItem->second == InstallState::USER_CHANGE) {
703         APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
704             oldInfo.GetBundleName().c_str(), newInfo.GetCurrentModulePackage().c_str());
705         if (UpdateInnerBundleInfo(newInfo, oldInfo)) {
706             bundleInfos_.at(bundleName) = oldInfo;
707             APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
708             return true;
709         }
710     }
711     return false;
712 }
713 
UpdateInnerBundleInfo(InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)714 bool BundleDataMgr::UpdateInnerBundleInfo(InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
715 {
716     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
717         oldInfo.KeepOldOverlayConnection(newInfo);
718     }
719     ProcessAllowedAcls(newInfo, oldInfo);
720     oldInfo.UpdateModuleInfo(newInfo);
721     oldInfo.SetDFXParamStatus();
722     // 1.exist entry, update entry.
723     // 2.only exist feature, update feature.
724     if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
725         UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
726     }
727     oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
728     if (oldInfo.GetOldAppIds().empty()) {
729         oldInfo.AddOldAppId(oldInfo.GetAppId());
730     }
731     oldInfo.AddOldAppId(newInfo.GetAppId());
732     oldInfo.SetProvisionId(newInfo.GetProvisionId());
733     oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
734     oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
735     oldInfo.UpdateAppDetailAbilityAttrs();
736     oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
737     if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
738         AddAppDetailAbilityInfo(oldInfo);
739     }
740     oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
741     oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
742     oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
743     if (newInfo.GetAppCrowdtestDeadline() != Constants::INHERIT_CROWDTEST_DEADLINE) {
744         oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
745     }
746     oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
747     // clear apply quick fix frequency
748     oldInfo.ResetApplyQuickFixFrequency();
749     oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
750     oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
751     oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
752     oldInfo.UpdateOdidByBundleInfo(newInfo);
753     oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
754 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
755     if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
756         if (!UpdateOverlayInfo(newInfo, oldInfo)) {
757             APP_LOGD("update overlay info failed");
758             return false;
759         }
760     }
761     if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
762         APP_LOGD("update overlay info failed");
763         return false;
764     }
765 #endif
766     return true;
767 }
768 
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const769 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
770     int32_t appIndex) const
771 {
772     int32_t requestUserId = GetUserId(userId);
773     if (requestUserId == Constants::INVALID_USERID) {
774         APP_LOGE("request user id is invalid");
775         return false;
776     }
777 
778     ElementName element = want.GetElement();
779     std::string bundleName = element.GetBundleName();
780     std::string abilityName = element.GetAbilityName();
781     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfo bundleName:%{public}s abilityName:%{public}s",
782         bundleName.c_str(), abilityName.c_str());
783     // explicit query
784     if (!bundleName.empty() && !abilityName.empty()) {
785         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
786         if (!ret) {
787             LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryAbility no match -n %{public}s -a %{public}s -u %{public}d"
788                 " -i %{public}d", bundleName.c_str(), abilityName.c_str(), userId, appIndex);
789             return false;
790         }
791         return true;
792     }
793     std::vector<AbilityInfo> abilityInfos;
794     bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
795     if (!ret) {
796         LOG_D(BMS_TAG_QUERY,
797             "implicit queryAbilityInfos error action:%{public}s uri:%{private}s type:%{public}s",
798             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
799         return false;
800     }
801     if (abilityInfos.size() == 0) {
802         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s",
803             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
804         return false;
805     }
806     abilityInfo = abilityInfos[0];
807     return true;
808 }
809 
GetCloneAbilityInfos(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const810 void BundleDataMgr::GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos,
811     const ElementName &element, int32_t flags, int32_t userId) const
812 {
813     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
814     if (cloneAppIndexes.empty()) {
815         APP_LOGI("clone app index is empty");
816         return;
817     }
818     for (int32_t appIndex: cloneAppIndexes) {
819         AbilityInfo cloneAbilityInfo;
820         bool ret = ExplicitQueryCloneAbilityInfo(element, flags, userId, appIndex, cloneAbilityInfo);
821         if (ret) {
822             abilityInfos.emplace_back(cloneAbilityInfo);
823         }
824     }
825 }
826 
GetCloneAbilityInfosV9(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const827 void BundleDataMgr::GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos,
828     const ElementName &element, int32_t flags, int32_t userId) const
829 {
830     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
831     if (cloneAppIndexes.empty()) {
832         APP_LOGI("clone app index is empty");
833         return;
834     }
835     for (int32_t appIndex: cloneAppIndexes) {
836         AbilityInfo cloneAbilityInfo;
837         ErrCode ret = ExplicitQueryCloneAbilityInfoV9(element, flags, userId, appIndex, cloneAbilityInfo);
838         if (ret == ERR_OK) {
839             abilityInfos.emplace_back(cloneAbilityInfo);
840         }
841     }
842 }
843 
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const844 bool BundleDataMgr::QueryAbilityInfos(
845     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
846 {
847     int32_t requestUserId = GetUserId(userId);
848     if (requestUserId == Constants::INVALID_USERID) {
849         APP_LOGE("request user id is invalid");
850         return false;
851     }
852 
853     ElementName element = want.GetElement();
854     std::string bundleName = element.GetBundleName();
855     std::string abilityName = element.GetAbilityName();
856     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfos bundleName:%{public}s abilityName:%{public}s",
857         bundleName.c_str(), abilityName.c_str());
858     // explicit query
859     if (!bundleName.empty() && !abilityName.empty()) {
860         AbilityInfo abilityInfo;
861         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
862         LOG_D(BMS_TAG_QUERY, "explicit query ret:%{public}d bundleName:%{public}s abilityName:%{public}s",
863             ret, bundleName.c_str(), abilityName.c_str());
864         if (ret) {
865             abilityInfos.emplace_back(abilityInfo);
866         }
867         // get cloneApp's abilityInfos
868         GetCloneAbilityInfos(abilityInfos, element, flags, userId);
869         LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryAbility size:%{public}zu -n %{public}s -a %{public}s -u %{public}d",
870             abilityInfos.size(), bundleName.c_str(), abilityName.c_str(), userId);
871         return !abilityInfos.empty();
872     }
873     // implicit query
874     (void)ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
875     ImplicitQueryCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
876     if (abilityInfos.size() == 0) {
877         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
878             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
879             requestUserId);
880         return false;
881     }
882     return true;
883 }
884 
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const885 ErrCode BundleDataMgr::QueryAbilityInfosV9(
886     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
887 {
888     int32_t requestUserId = GetUserId(userId);
889     if (requestUserId == Constants::INVALID_USERID) {
890         APP_LOGE("request user id is invalid");
891         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
892     }
893 
894     ElementName element = want.GetElement();
895     std::string bundleName = element.GetBundleName();
896     std::string abilityName = element.GetAbilityName();
897     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfosV9 bundleName:%{public}s abilityName:%{public}s",
898         bundleName.c_str(), abilityName.c_str());
899     // explicit query
900     if (!bundleName.empty() && !abilityName.empty()) {
901         AbilityInfo abilityInfo;
902         ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
903         LOG_D(BMS_TAG_QUERY, "explicit queryV9 ret:%{public}d, bundleName:%{public}s abilityName:%{public}s",
904             ret, bundleName.c_str(), abilityName.c_str());
905         if (ret == ERR_OK) {
906             abilityInfos.emplace_back(abilityInfo);
907         }
908         // get cloneApp's abilityInfos
909         GetCloneAbilityInfosV9(abilityInfos, element, flags, userId);
910         LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryAbility V9 size:%{public}zu -n %{public}s -a %{public}s -u %{public}d",
911             abilityInfos.size(), bundleName.c_str(), abilityName.c_str(), userId);
912         if (abilityInfos.empty()) {
913             return ret;
914         }
915         return ERR_OK;
916     }
917     // implicit query
918     ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
919     ImplicitQueryCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
920     if (abilityInfos.empty()) {
921         if (ret != ERR_OK) {
922             return ret;
923         }
924         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
925             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
926             requestUserId);
927         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
928     }
929     return ERR_OK;
930 }
931 
BatchQueryAbilityInfos(const std::vector<Want> & wants,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const932 ErrCode BundleDataMgr::BatchQueryAbilityInfos(
933     const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
934 {
935     int32_t requestUserId = GetUserId(userId);
936     if (requestUserId == Constants::INVALID_USERID) {
937         APP_LOGE("request user id is invalid");
938         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
939     }
940 
941     for (size_t i = 0; i < wants.size(); i++) {
942         std::vector<AbilityInfo> tmpAbilityInfos;
943         ElementName element = wants[i].GetElement();
944         std::string bundleName = element.GetBundleName();
945         std::string abilityName = element.GetAbilityName();
946         APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
947             bundleName.c_str(), abilityName.c_str());
948         // explicit query
949         if (!bundleName.empty() && !abilityName.empty()) {
950             AbilityInfo abilityInfo;
951             ErrCode ret = ExplicitQueryAbilityInfoV9(wants[i], flags, requestUserId, abilityInfo);
952             if (ret != ERR_OK) {
953                 APP_LOGE("explicit queryAbilityInfoV9 error:%{public}d, bundleName:%{public}s, abilityName:%{public}s",
954                     ret, bundleName.c_str(), abilityName.c_str());
955                 return ret;
956             }
957             tmpAbilityInfos.emplace_back(abilityInfo);
958         } else {
959             // implicit query
960             ErrCode ret = ImplicitQueryAbilityInfosV9(wants[i], flags, requestUserId, tmpAbilityInfos);
961             if (ret != ERR_OK) {
962                 APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
963                     wants[i].GetAction().c_str(), wants[i].GetUriString().c_str(), wants[i].GetType().c_str());
964                 return ret;
965             }
966         }
967         for (size_t j = 0; j < tmpAbilityInfos.size(); j++) {
968             auto it = std::find_if(abilityInfos.begin(), abilityInfos.end(),
969                 [&](const AbilityInfo& info) {
970                     return tmpAbilityInfos[j].bundleName == info.bundleName &&
971                         tmpAbilityInfos[j].moduleName == info.moduleName &&
972                         tmpAbilityInfos[j].name == info.name;
973                 });
974             if (it == abilityInfos.end()) {
975                 abilityInfos.push_back(tmpAbilityInfos[j]);
976             }
977         }
978     }
979 
980     if (abilityInfos.empty()) {
981         APP_LOGW("no matching abilityInfo");
982         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
983     }
984 
985     return ERR_OK;
986 }
987 
ExplicitQueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const988 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
989     AbilityInfo &abilityInfo, int32_t appIndex) const
990 {
991     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
992     ElementName element = want.GetElement();
993     std::string bundleName = element.GetBundleName();
994     std::string abilityName = element.GetAbilityName();
995     std::string moduleName = element.GetModuleName();
996     LOG_D(BMS_TAG_QUERY,
997         "ExplicitQueryAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
998         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
999     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1000 
1001     int32_t requestUserId = GetUserId(userId);
1002     if (requestUserId == Constants::INVALID_USERID) {
1003         APP_LOGE("request user id is invalid");
1004         return false;
1005     }
1006 
1007     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1008     InnerBundleInfo innerBundleInfo;
1009     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
1010         LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
1011         return false;
1012     }
1013     // explict query from sandbox manager
1014     if (appIndex > 0) {
1015         if (sandboxAppHelper_ == nullptr) {
1016             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1017             return false;
1018         }
1019         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1020         if (ret != ERR_OK) {
1021             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1022                 ret, bundleName.c_str());
1023             return false;
1024         }
1025     }
1026 
1027     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1028     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
1029     if (!ability) {
1030         LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbility not found UIAbility -n %{public}s -m %{public}s -a %{public}s"
1031             " -u %{public}d", bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), responseUserId);
1032         return false;
1033     }
1034     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1035 }
1036 
ExplicitQueryAbilityInfoV9(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const1037 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
1038     AbilityInfo &abilityInfo, int32_t appIndex) const
1039 {
1040     ElementName element = want.GetElement();
1041     std::string bundleName = element.GetBundleName();
1042     std::string abilityName = element.GetAbilityName();
1043     std::string moduleName = element.GetModuleName();
1044     LOG_D(BMS_TAG_QUERY,
1045         "ExplicitQueryAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
1046         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1047     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1048     int32_t requestUserId = GetUserId(userId);
1049     if (requestUserId == Constants::INVALID_USERID) {
1050         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1051     }
1052     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1053     InnerBundleInfo innerBundleInfo;
1054     if (appIndex == 0) {
1055         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
1056         if (ret != ERR_OK) {
1057             LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
1058             return ret;
1059         }
1060     }
1061     // explict query from sandbox manager
1062     if (appIndex > 0) {
1063         if (sandboxAppHelper_ == nullptr) {
1064             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1065             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1066         }
1067         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1068         if (ret != ERR_OK) {
1069             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1070                 ret, bundleName.c_str());
1071             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1072         }
1073     }
1074 
1075     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1076     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
1077     if (!ability) {
1078         LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 not found UIAbility -n %{public}s -m %{public}s "
1079             "-a %{public}s", bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1080         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1081     }
1082 
1083     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1084 }
1085 
FilterAbilityInfosByModuleName(const std::string & moduleName,std::vector<AbilityInfo> & abilityInfos) const1086 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
1087     std::vector<AbilityInfo> &abilityInfos) const
1088 {
1089     LOG_D(BMS_TAG_QUERY, "FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
1090     if (moduleName.empty()) {
1091         return;
1092     }
1093     for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
1094         if (iter->moduleName != moduleName) {
1095             iter = abilityInfos.erase(iter);
1096         } else {
1097             ++iter;
1098         }
1099     }
1100 }
1101 
ImplicitQueryCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1102 void BundleDataMgr::ImplicitQueryCloneAbilityInfos(
1103     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1104 {
1105     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfos");
1106     int32_t requestUserId = GetUserId(userId);
1107     if (requestUserId == Constants::INVALID_USERID) {
1108         return;
1109     }
1110 
1111     if (want.GetAction().empty() && want.GetEntities().empty()
1112         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1113         LOG_E(BMS_TAG_QUERY, "param invalid");
1114         return;
1115     }
1116     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1117         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1118     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1119     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1120     if (bundleInfos_.empty()) {
1121         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1122         return;
1123     }
1124     std::string bundleName = want.GetElement().GetBundleName();
1125     if (!bundleName.empty()) {
1126         // query in current bundleName
1127         if (!ImplicitQueryCurCloneAbilityInfos(want, flags, requestUserId, abilityInfos)) {
1128             return;
1129         }
1130     } else {
1131         // query all
1132         ImplicitQueryAllCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
1133     }
1134     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1135     // sort by priority, descending order.
1136     if (abilityInfos.size() > 1) {
1137         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1138             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1139     }
1140     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfos");
1141 }
1142 
ImplicitQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1143 bool BundleDataMgr::ImplicitQueryAbilityInfos(
1144     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1145 {
1146     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1147     int32_t requestUserId = GetUserId(userId);
1148     if (requestUserId == Constants::INVALID_USERID) {
1149         return false;
1150     }
1151 
1152     if (want.GetAction().empty() && want.GetEntities().empty()
1153         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1154         LOG_W(BMS_TAG_QUERY, "param invalid");
1155         return false;
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     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1161     if (bundleInfos_.empty()) {
1162         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1163         return false;
1164     }
1165     std::string bundleName = want.GetElement().GetBundleName();
1166     if (!bundleName.empty()) {
1167         // query in current bundleName
1168         if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
1169             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s",
1170                 bundleName.c_str());
1171             return false;
1172         }
1173     } else {
1174         // query all
1175         ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
1176     }
1177     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1178     // sort by priority, descending order.
1179     if (abilityInfos.size() > 1) {
1180         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1181             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1182     }
1183     return true;
1184 }
1185 
ImplicitQueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1186 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
1187     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1188 {
1189     int32_t requestUserId = GetUserId(userId);
1190     if (requestUserId == Constants::INVALID_USERID) {
1191         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1192     }
1193 
1194     if (want.GetAction().empty() && want.GetEntities().empty()
1195         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1196         LOG_E(BMS_TAG_QUERY, "param invalid");
1197         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1198     }
1199     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1200         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1201     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1202     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1203     if (bundleInfos_.empty()) {
1204         APP_LOGW("bundleInfos_ is empty");
1205         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1206     }
1207     std::string bundleName = want.GetElement().GetBundleName();
1208     if (!bundleName.empty()) {
1209         // query in current bundleName
1210         ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1211         if (ret != ERR_OK) {
1212             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed bundleName:%{public}s",
1213                 bundleName.c_str());
1214             return ret;
1215         }
1216     } else {
1217         // query all
1218         ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1219     }
1220     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1221     // sort by priority, descending order.
1222     if (abilityInfos.size() > 1) {
1223         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1224             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1225     }
1226     return ERR_OK;
1227 }
1228 
ImplicitQueryCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1229 void BundleDataMgr::ImplicitQueryCloneAbilityInfosV9(
1230     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1231 {
1232     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfosV9");
1233     int32_t requestUserId = GetUserId(userId);
1234     if (requestUserId == Constants::INVALID_USERID) {
1235         return;
1236     }
1237     if (want.GetAction().empty() && want.GetEntities().empty()
1238         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1239         LOG_E(BMS_TAG_QUERY, "param invalid");
1240         return;
1241     }
1242     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1243         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1244     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1245 
1246     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1247     if (bundleInfos_.empty()) {
1248         APP_LOGW("bundleInfos_ is empty");
1249         return;
1250     }
1251     std::string bundleName = want.GetElement().GetBundleName();
1252     if (!bundleName.empty()) {
1253         // query in current bundleName
1254         if (!ImplicitQueryCurCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos)) {
1255             return;
1256         }
1257     } else {
1258         // query all
1259         ImplicitQueryAllCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
1260     }
1261     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1262     // sort by priority, descending order.
1263     if (abilityInfos.size() > 1) {
1264         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1265             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1266     }
1267     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfosV9");
1268 }
1269 
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1270 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
1271     const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const
1272 {
1273     LOG_D(BMS_TAG_QUERY,
1274         "begin to QueryAbilityInfoWithFlags flags=%{public}d,userId=%{public}d,appIndex=%{public}d",
1275         flags, userId, appIndex);
1276     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1277         !innerBundleInfo.IsSystemApp()) {
1278         LOG_W(BMS_TAG_QUERY, "no system app ability info for this calling");
1279         return false;
1280     }
1281     if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1282         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1283             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1284                 option->bundleName.c_str(), option->name.c_str());
1285             return false;
1286         }
1287     }
1288     info = (*option);
1289     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
1290         info.permissions.clear();
1291     }
1292     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1293         info.metaData.customizeData.clear();
1294         info.metadata.clear();
1295     }
1296     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
1297         info.skills.clear();
1298     }
1299     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
1300         innerBundleInfo.GetApplicationInfo(
1301             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
1302     }
1303     // set uid for NAPI cache use
1304     InnerBundleUserInfo innerBundleUserInfo;
1305     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1306         if (appIndex == 0) {
1307             info.uid = innerBundleUserInfo.uid;
1308         } else {
1309             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1310             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1311                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1312                 info.uid = cloneInfo.uid;
1313                 info.appIndex = cloneInfo.appIndex;
1314             } else {
1315                 LOG_W(BMS_TAG_QUERY, "can't find cloneInfos");
1316                 return false;
1317             }
1318         }
1319     }
1320     return true;
1321 }
1322 
IsSystemApp(const std::string & bundleName,bool & isSystemApp)1323 ErrCode BundleDataMgr::IsSystemApp(const std::string &bundleName, bool &isSystemApp)
1324 {
1325     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
1326     auto bundleInfoItem = bundleInfos_.find(bundleName);
1327     if (bundleInfoItem == bundleInfos_.end()) {
1328         APP_LOGW("%{public}s not found", bundleName.c_str());
1329         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1330     }
1331     isSystemApp = bundleInfoItem->second.IsSystemApp();
1332     return ERR_OK;
1333 }
1334 
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1335 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
1336     int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info,
1337     int32_t appIndex) const
1338 {
1339     LOG_D(BMS_TAG_QUERY, "begin to QueryAbilityInfoWithFlagsV9");
1340     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1341         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
1342         !innerBundleInfo.IsSystemApp()) {
1343         LOG_W(BMS_TAG_QUERY, "target not system app");
1344         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1345     }
1346     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1347         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1348             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1349                 option->bundleName.c_str(), option->name.c_str());
1350             return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1351         }
1352     }
1353     info = (*option);
1354     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1355         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1356         info.permissions.clear();
1357     }
1358     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1359         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1360         info.metaData.customizeData.clear();
1361         info.metadata.clear();
1362     }
1363     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1364         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1365         info.skills.clear();
1366     }
1367     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1368         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1369         innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1370             userId, info.applicationInfo, appIndex);
1371     }
1372     // set uid for NAPI cache use
1373     InnerBundleUserInfo innerBundleUserInfo;
1374     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1375         if (appIndex == 0) {
1376             info.uid = innerBundleUserInfo.uid;
1377         } else {
1378             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1379             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1380                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1381                 info.uid = cloneInfo.uid;
1382                 info.appIndex = cloneInfo.appIndex;
1383             } else {
1384                 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1385             }
1386         }
1387     }
1388     return ERR_OK;
1389 }
1390 
ImplicitQueryCurAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1391 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1392     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1393 {
1394     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfos");
1395     std::string bundleName = want.GetElement().GetBundleName();
1396     InnerBundleInfo innerBundleInfo;
1397     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
1398         LOG_W(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s", bundleName.c_str());
1399         return false;
1400     }
1401     if (appIndex > 0) {
1402         if (sandboxAppHelper_ == nullptr) {
1403             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1404             return false;
1405         }
1406         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1407         if (ret != ERR_OK) {
1408             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode:%{public}d bundleName:%{public}s",
1409                 ret, bundleName.c_str());
1410             return false;
1411         }
1412     }
1413     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1414     std::vector<std::string> mimeTypes;
1415     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1416     GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1417     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1418     return true;
1419 }
1420 
ImplicitQueryCurCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1421 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1422     std::vector<AbilityInfo> &abilityInfos) const
1423 {
1424     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfos");
1425     std::string bundleName = want.GetElement().GetBundleName();
1426     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1427     if (cloneAppIndexes.empty()) {
1428         return false;
1429     }
1430     std::vector<std::string> mimeTypes;
1431     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1432     for (int32_t appIndex: cloneAppIndexes) {
1433         InnerBundleInfo innerBundleInfo;
1434         if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex)) {
1435             continue;
1436         }
1437         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1438 
1439         GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1440         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1441     }
1442     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfos");
1443     return true;
1444 }
1445 
ImplicitQueryCurAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1446 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1447     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1448 {
1449     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1450     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfosV9");
1451     std::string bundleName = want.GetElement().GetBundleName();
1452     InnerBundleInfo innerBundleInfo;
1453     if (appIndex == 0) {
1454         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1455         if (ret != ERR_OK) {
1456             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s",
1457                 bundleName.c_str());
1458             return ret;
1459         }
1460     }
1461     if (appIndex > 0) {
1462         if (sandboxAppHelper_ == nullptr) {
1463             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1464             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1465         }
1466         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1467         if (ret != ERR_OK) {
1468             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d bundleName:%{public}s",
1469                 ret, bundleName.c_str());
1470             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1471         }
1472     }
1473     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1474     std::vector<std::string> mimeTypes;
1475     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1476     GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1477     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1478     return ERR_OK;
1479 }
1480 
ImplicitQueryCurCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1481 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1482     std::vector<AbilityInfo> &abilityInfos) const
1483 {
1484     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfosV9");
1485     std::string bundleName = want.GetElement().GetBundleName();
1486 
1487     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1488     if (cloneAppIndexes.empty()) {
1489         return false;
1490     }
1491     std::vector<std::string> mimeTypes;
1492     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1493     for (int32_t appIndex: cloneAppIndexes) {
1494         InnerBundleInfo innerBundleInfo;
1495         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
1496         if (ret != ERR_OK) {
1497             LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1498                 bundleName.c_str(), appIndex);
1499             continue;
1500         }
1501         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1502         GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1503         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1504     }
1505     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfosV9");
1506     return true;
1507 }
1508 
ImplicitQueryAllAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1509 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1510     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1511 {
1512     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfos");
1513     int32_t requestUserId = GetUserId(userId);
1514     if (requestUserId == Constants::INVALID_USERID) {
1515         LOG_W(BMS_TAG_QUERY, "invalid userId");
1516         return;
1517     }
1518     std::vector<std::string> mimeTypes;
1519     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1520     // query from bundleInfos_
1521     if (appIndex == 0) {
1522         for (const auto &item : bundleInfos_) {
1523             const InnerBundleInfo &innerBundleInfo = item.second;
1524             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1525             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1526                 LOG_D(BMS_TAG_QUERY,
1527                     "ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1528                     innerBundleInfo.GetBundleName().c_str(), responseUserId);
1529                 continue;
1530             }
1531             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1532         }
1533     } else {
1534         // query from sandbox manager for sandbox bundle
1535         if (sandboxAppHelper_ == nullptr) {
1536             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1537             return;
1538         }
1539         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1540         for (const auto &item : sandboxMap) {
1541             InnerBundleInfo info;
1542             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1543             if (pos == std::string::npos) {
1544                 LOG_D(BMS_TAG_QUERY, "sandbox map contains invalid element");
1545                 continue;
1546             }
1547             std::string innerBundleName = item.first.substr(pos + 1);
1548             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1549                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1550                 continue;
1551             }
1552             int32_t responseUserId = info.GetResponseUserId(userId);
1553             GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1554         }
1555     }
1556     APP_LOGD("finish to ImplicitQueryAllAbilityInfos");
1557 }
1558 
ImplicitQueryAllCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1559 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1560     std::vector<AbilityInfo> &abilityInfos) const
1561 {
1562     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfos");
1563     int32_t requestUserId = GetUserId(userId);
1564     if (requestUserId == Constants::INVALID_USERID) {
1565         LOG_W(BMS_TAG_QUERY, "invalid userId");
1566         return;
1567     }
1568     std::vector<std::string> mimeTypes;
1569     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1570     for (const auto &item : bundleInfos_) {
1571         const InnerBundleInfo &innerBundleInfo = item.second;
1572         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
1573         if (cloneAppIndexes.empty()) {
1574             continue;
1575         }
1576         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1577         for (int32_t appIndex: cloneAppIndexes) {
1578             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
1579                 LOG_D(BMS_TAG_QUERY,
1580                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
1581                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
1582                 continue;
1583             }
1584             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1585         }
1586     }
1587     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfos");
1588 }
1589 
ImplicitQueryAllAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1590 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1591     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1592 {
1593     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1594     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfosV9");
1595     // query from bundleInfos_
1596     std::vector<std::string> mimeTypes;
1597     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1598     if (appIndex == 0) {
1599         for (const auto &item : bundleInfos_) {
1600             const InnerBundleInfo &innerBundleInfo = item.second;
1601             ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
1602             if (ret != ERR_OK) {
1603                 continue;
1604             }
1605 
1606             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1607             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1608         }
1609     } else {
1610         // query from sandbox manager for sandbox bundle
1611         if (sandboxAppHelper_ == nullptr) {
1612             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1613             return;
1614         }
1615         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1616         for (const auto &item : sandboxMap) {
1617             InnerBundleInfo info;
1618             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1619             if (pos == std::string::npos) {
1620                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
1621                 continue;
1622             }
1623             std::string innerBundleName = item.first.substr(pos + 1);
1624             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1625                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1626                 continue;
1627             }
1628 
1629             int32_t responseUserId = info.GetResponseUserId(userId);
1630             GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1631         }
1632     }
1633     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllAbilityInfosV9");
1634 }
1635 
ImplicitQueryAllCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1636 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1637     std::vector<AbilityInfo> &abilityInfos) const
1638 {
1639     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfosV9");
1640     std::vector<std::string> mimeTypes;
1641     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1642     for (const auto &item : bundleInfos_) {
1643         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(item.second.GetBundleName(), userId);
1644         if (cloneAppIndexes.empty()) {
1645             continue;
1646         }
1647         for (int32_t appIndex: cloneAppIndexes) {
1648             InnerBundleInfo innerBundleInfo;
1649             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId, appIndex);
1650             if (ret != ERR_OK) {
1651                 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1652                     item.first.c_str(), appIndex);
1653                 continue;
1654             }
1655 
1656             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1657             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1658         }
1659     }
1660     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfosV9");
1661 }
1662 
CheckAbilityInfoFlagExist(int32_t flags,AbilityInfoFlag abilityInfoFlag) const1663 bool BundleDataMgr::CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const
1664 {
1665     return (static_cast<uint32_t>(flags) & static_cast<uint32_t>(abilityInfoFlag)) == abilityInfoFlag;
1666 }
1667 
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) const1668 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags, const InnerBundleInfo &info,
1669     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1670     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1671 {
1672     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1673     if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_SYSTEMAPP_ONLY) && !info.IsSystemApp()) {
1674         return;
1675     }
1676     const std::map<std::string, std::vector<Skill>> &skillInfos = info.GetInnerSkillInfos();
1677     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1678         bool isPrivateType = MatchPrivateType(
1679             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1680         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1681         if (skillsPair == skillInfos.end()) {
1682             continue;
1683         }
1684         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1685             const Skill &skill = skillsPair->second[skillIndex];
1686             size_t matchUriIndex = 0;
1687             if (isPrivateType || skill.Match(want, matchUriIndex)) {
1688                 AbilityInfo abilityinfo = InnerAbilityInfo::ConvertToAbilityInfo(abilityInfoPair.second);
1689                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1690                     continue;
1691                 }
1692                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_DISABLE) &&
1693                     !info.IsAbilityEnabled(abilityinfo, GetUserId(userId), appIndex)) {
1694                     LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityinfo.name.c_str());
1695                     continue;
1696                 }
1697                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_APPLICATION)) {
1698                     info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1699                         userId, abilityinfo.applicationInfo, appIndex);
1700                 }
1701                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_PERMISSION)) {
1702                     abilityinfo.permissions.clear();
1703                 }
1704                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_METADATA)) {
1705                     abilityinfo.metaData.customizeData.clear();
1706                     abilityinfo.metadata.clear();
1707                 }
1708                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL)) {
1709                     abilityinfo.skills.clear();
1710                 }
1711                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL_URI)) {
1712                     AddSkillUrisInfo(skillsPair->second, abilityinfo.skillUri, skillIndex, matchUriIndex);
1713                 }
1714                 abilityinfo.appIndex = appIndex;
1715                 abilityInfos.emplace_back(abilityinfo);
1716                 break;
1717             }
1718         }
1719     }
1720 }
1721 
AddSkillUrisInfo(const std::vector<Skill> & skills,std::vector<SkillUriForAbilityAndExtension> & skillUris,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex) const1722 void BundleDataMgr::AddSkillUrisInfo(const std::vector<Skill> &skills,
1723     std::vector<SkillUriForAbilityAndExtension> &skillUris,
1724     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const
1725 {
1726     for (size_t skillIndex = 0; skillIndex < skills.size(); ++skillIndex) {
1727         const Skill &skill = skills[skillIndex];
1728         for (size_t uriIndex = 0; uriIndex < skill.uris.size(); ++uriIndex) {
1729             const SkillUri &uri = skill.uris[uriIndex];
1730             SkillUriForAbilityAndExtension skillinfo;
1731             skillinfo.scheme = uri.scheme;
1732             skillinfo.host = uri.host;
1733             skillinfo.port = uri.port;
1734             skillinfo.path = uri.path;
1735             skillinfo.pathStartWith = uri.pathStartWith;
1736             skillinfo.pathRegex = uri.pathRegex;
1737             skillinfo.type = uri.type;
1738             skillinfo.utd = uri.utd;
1739             skillinfo.maxFileSupported = uri.maxFileSupported;
1740             skillinfo.linkFeature = uri.linkFeature;
1741             if (matchSkillIndex.has_value() && matchUriIndex.has_value() &&
1742                 skillIndex == matchSkillIndex.value() && uriIndex == matchUriIndex.value()) {
1743                 skillinfo.isMatch = true;
1744             }
1745             skillUris.emplace_back(skillinfo);
1746         }
1747     }
1748 }
1749 
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) const1750 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
1751     AbilityInfo &abilityInfo, int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos,
1752     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
1753 {
1754     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1755         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1756         if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId), appIndex)) {
1757             LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityInfo.name.c_str());
1758             return;
1759         }
1760     }
1761     if ((static_cast<uint32_t>(flags) &
1762         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1763         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1764         info.GetApplicationInfoV9(static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1765             userId, abilityInfo.applicationInfo, appIndex);
1766     }
1767     if ((static_cast<uint32_t>(flags) &
1768         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1769         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1770         abilityInfo.permissions.clear();
1771     }
1772     if ((static_cast<uint32_t>(flags) &
1773         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1774         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1775         abilityInfo.metaData.customizeData.clear();
1776         abilityInfo.metadata.clear();
1777     }
1778     if ((static_cast<uint32_t>(flags) &
1779         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1780         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1781         abilityInfo.skills.clear();
1782     }
1783     if ((static_cast<uint32_t>(flags) &
1784         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) ==
1785         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) {
1786         AddSkillUrisInfo(skills, abilityInfo.skillUri, matchSkillIndex, matchUriIndex);
1787     }
1788     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
1789         // set uid for NAPI cache use
1790         InnerBundleUserInfo innerBundleUserInfo;
1791         if (info.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1792             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1793             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1794                 abilityInfo.uid = innerBundleUserInfo.cloneInfos.at(appIndexKey).uid;
1795                 abilityInfo.appIndex = innerBundleUserInfo.cloneInfos.at(appIndexKey).appIndex;
1796             }
1797         }
1798     }
1799     infos.emplace_back(abilityInfo);
1800 }
1801 
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) const1802 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags, const InnerBundleInfo &info,
1803     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1804     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1805 {
1806     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
1807     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1808         static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1809         LOG_W(BMS_TAG_QUERY, "target not system app");
1810         return;
1811     }
1812     const std::map<std::string, std::vector<Skill>> &skillInfos = info.GetInnerSkillInfos();
1813     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1814         AbilityInfo abilityinfo = InnerAbilityInfo::ConvertToAbilityInfo(abilityInfoPair.second);
1815         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1816         if (skillsPair == skillInfos.end()) {
1817             continue;
1818         }
1819         bool isPrivateType = MatchPrivateType(
1820             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1821         if (isPrivateType) {
1822             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1823                 std::nullopt, std::nullopt, appIndex);
1824             continue;
1825         }
1826         if (want.GetAction() == SHARE_ACTION) {
1827             if (!MatchShare(want, skillsPair->second)) {
1828                 continue;
1829             }
1830             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1831                 std::nullopt, std::nullopt, appIndex);
1832             continue;
1833         }
1834         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1835             const Skill &skill = skillsPair->second[skillIndex];
1836             size_t matchUriIndex = 0;
1837             if (skill.Match(want, matchUriIndex)) {
1838                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1839                     continue;
1840                 }
1841                 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1842                     skillIndex, matchUriIndex, appIndex);
1843                 break;
1844             }
1845         }
1846     }
1847 }
1848 
MatchShare(const Want & want,const std::vector<Skill> & skills) const1849 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1850 {
1851     if (want.GetAction() != SHARE_ACTION) {
1852         LOG_E(BMS_TAG_QUERY, "action not action");
1853         return false;
1854     }
1855     std::vector<Skill> shareActionSkills = FindSkillsContainShareAction(skills);
1856     if (shareActionSkills.empty()) {
1857         LOG_D(BMS_TAG_QUERY, "shareActionSkills is empty");
1858         return false;
1859     }
1860     auto wantParams = want.GetParams();
1861     auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1862     int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1863     if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1864         LOG_W(BMS_TAG_QUERY, "Invalid total count");
1865     }
1866     auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1867     auto utds = shareSummary.KeySet();
1868     for (auto &skill : shareActionSkills) {
1869         bool match = true;
1870         for (const auto &utd : utds) {
1871             int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1872             if (!MatchUtd(skill, utd, count)) {
1873                 match = false;
1874                 break;
1875             }
1876         }
1877         if (match) {
1878             return true;
1879         }
1880     }
1881     return false;
1882 }
1883 
MatchUtd(Skill & skill,const std::string & utd,int32_t count) const1884 bool BundleDataMgr::MatchUtd(Skill &skill, const std::string &utd, int32_t count) const
1885 {
1886     if (skill.uris.empty() || count <= DEFAULT_SUMMARY_COUNT) {
1887         LOG_W(BMS_TAG_QUERY, "skill.uris is empty or invalid utd count");
1888         return false;
1889     }
1890     bool isMatch = false;
1891     for (SkillUri &skillUri : skill.uris) {
1892         if (!skillUri.utd.empty()) {
1893             if (MatchUtd(skillUri.utd, utd)) {
1894                 skillUri.maxFileSupported -= count;
1895                 isMatch = true;
1896                 if (skillUri.maxFileSupported < 0) {
1897                     return false;
1898                 }
1899             }
1900         } else {
1901             if (MatchTypeWithUtd(skillUri.type, utd)) {
1902                 skillUri.maxFileSupported -= count;
1903                 isMatch = true;
1904                 if (skillUri.maxFileSupported < 0) {
1905                     return false;
1906                 }
1907             }
1908         }
1909     }
1910     return isMatch;
1911 }
1912 
MatchUtd(const std::string & skillUtd,const std::string & wantUtd) const1913 bool BundleDataMgr::MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const
1914 {
1915 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1916     LOG_D(BMS_TAG_QUERY, "skillUtd %{public}s, wantUtd %{public}s", skillUtd.c_str(), wantUtd.c_str());
1917     std::shared_ptr<UDMF::TypeDescriptor> wantTypeDescriptor;
1918     auto ret = UDMF::UtdClient::GetInstance().GetTypeDescriptor(wantUtd, wantTypeDescriptor);
1919     if (ret != ERR_OK || wantTypeDescriptor == nullptr) {
1920         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1921         return false;
1922     }
1923     bool matchRet = false;
1924     ret = wantTypeDescriptor->BelongsTo(skillUtd, matchRet);
1925     if (ret != ERR_OK) {
1926         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1927         return false;
1928     }
1929     return matchRet;
1930 #endif
1931     return false;
1932 }
1933 
MatchTypeWithUtd(const std::string & mimeType,const std::string & wantUtd) const1934 bool BundleDataMgr::MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const
1935 {
1936 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1937     LOG_D(BMS_TAG_QUERY, "mimeType %{public}s, wantUtd %{public}s", mimeType.c_str(), wantUtd.c_str());
1938     std::vector<std::string> typeUtdVector = BundleUtil::GetUtdVectorByMimeType(mimeType);
1939     for (const std::string &typeUtd : typeUtdVector) {
1940         if (MatchUtd(typeUtd, wantUtd)) {
1941             return true;
1942         }
1943     }
1944     return false;
1945 #endif
1946     return false;
1947 }
1948 
FindSkillsContainShareAction(const std::vector<Skill> & skills) const1949 std::vector<Skill> BundleDataMgr::FindSkillsContainShareAction(const std::vector<Skill> &skills) const
1950 {
1951     std::vector<Skill> shareActionSkills;
1952     for (const auto &skill : skills) {
1953         auto &actions = skill.actions;
1954         auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1955             return SHARE_ACTION == action;
1956         });
1957         if (matchAction == actions.end()) {
1958             continue;
1959         }
1960         shareActionSkills.emplace_back(skill);
1961     }
1962     return shareActionSkills;
1963 }
1964 
ModifyLauncherAbilityInfo(bool isStage,AbilityInfo & abilityInfo) const1965 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1966 {
1967     if (abilityInfo.labelId == 0) {
1968         if (isStage) {
1969             abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1970             abilityInfo.label = abilityInfo.applicationInfo.label;
1971         } else {
1972             abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1973             abilityInfo.label = abilityInfo.bundleName;
1974         }
1975     }
1976 
1977     if (abilityInfo.iconId == 0) {
1978         abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1979     }
1980 }
1981 
GetMatchLauncherAbilityInfos(const Want & want,const InnerBundleInfo & info,std::vector<AbilityInfo> & abilityInfos,int64_t installTime,int32_t userId) const1982 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1983     const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1984     int64_t installTime, int32_t userId) const
1985 {
1986     int32_t requestUserId = GetUserId(userId);
1987     if (requestUserId == Constants::INVALID_USERID) {
1988         APP_LOGD("request user id is invalid");
1989         return;
1990     }
1991     int32_t responseUserId = info.GetResponseUserId(requestUserId);
1992     if (responseUserId == Constants::INVALID_USERID) {
1993         APP_LOGD("response user id is invalid");
1994         return;
1995     }
1996     // get clone bundle info
1997     InnerBundleUserInfo bundleUserInfo;
1998     (void)info.GetInnerBundleUserInfo(responseUserId, bundleUserInfo);
1999     if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(info.GetBundleName()) !=
2000         ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) {
2001         GetMultiLauncherAbilityInfo(want, info, bundleUserInfo, installTime, abilityInfos);
2002         return;
2003     }
2004     AbilityInfo mainAbilityInfo;
2005     info.GetMainAbilityInfo(mainAbilityInfo);
2006     if (!mainAbilityInfo.name.empty() && (mainAbilityInfo.type == AbilityType::PAGE)) {
2007         APP_LOGD("bundleName %{public}s exist mainAbility", info.GetBundleName().c_str());
2008         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2009             responseUserId, mainAbilityInfo.applicationInfo);
2010         BmsExtensionDataMgr bmsExtensionDataMgr;
2011         if (mainAbilityInfo.applicationInfo.removable &&
2012             !bmsExtensionDataMgr.IsTargetApp(info.GetBundleName(), info.GetAppIdentifier())) {
2013             mainAbilityInfo.applicationInfo.removable = info.GetUninstallState();
2014         }
2015         mainAbilityInfo.installTime = installTime;
2016         // fix labelId or iconId is equal 0
2017         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), mainAbilityInfo);
2018         abilityInfos.emplace_back(mainAbilityInfo);
2019         GetMatchLauncherAbilityInfosForCloneInfos(info, mainAbilityInfo, bundleUserInfo,
2020             abilityInfos);
2021         return;
2022     }
2023     // add app detail ability
2024     if (info.GetBaseApplicationInfo().needAppDetail) {
2025         LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s add detail ability info", info.GetBundleName().c_str());
2026         std::string moduleName = "";
2027         auto ability = info.FindAbilityInfo(moduleName, ServiceConstants::APP_DETAIL_ABILITY, responseUserId);
2028         if (!ability) {
2029             LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s cant find ability", info.GetBundleName().c_str());
2030             return;
2031         }
2032         if (!info.GetIsNewVersion()) {
2033             ability->applicationInfo.label = info.GetBundleName();
2034         }
2035         ability->installTime = installTime;
2036         abilityInfos.emplace_back(*ability);
2037         GetMatchLauncherAbilityInfosForCloneInfos(info, *ability, bundleUserInfo, abilityInfos);
2038     }
2039 }
2040 
GetMultiLauncherAbilityInfo(const Want & want,const InnerBundleInfo & info,const InnerBundleUserInfo & bundleUserInfo,int64_t installTime,std::vector<AbilityInfo> & abilityInfos) const2041 void BundleDataMgr::GetMultiLauncherAbilityInfo(const Want& want,
2042     const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo,
2043     int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const
2044 {
2045     int32_t count = 0;
2046     const std::map<std::string, std::vector<Skill>> &skillInfos = info.GetInnerSkillInfos();
2047     for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
2048         auto skillsPair = skillInfos.find(abilityInfoPair.first);
2049         if (skillsPair == skillInfos.end()) {
2050             continue;
2051         }
2052         for (const Skill& skill : skillsPair->second) {
2053             if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
2054                 count++;
2055                 AbilityInfo abilityInfo = InnerAbilityInfo::ConvertToAbilityInfo(abilityInfoPair.second);
2056                 AbilityInfo tmpInfo = abilityInfo;
2057                 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2058                     bundleUserInfo.bundleUserInfo.userId, abilityInfo.applicationInfo);
2059                 abilityInfo.installTime = installTime;
2060                 // fix labelId or iconId is equal 0
2061                 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), abilityInfo);
2062                 abilityInfos.emplace_back(abilityInfo);
2063                 GetMatchLauncherAbilityInfosForCloneInfos(info, tmpInfo, bundleUserInfo, abilityInfos);
2064                 break;
2065             }
2066         }
2067     }
2068     APP_LOGI_NOFUNC("GetMultiLauncherAbilityInfo -n %{public}s has %{public}d launcher ability",
2069         info.GetBundleName().c_str(), count);
2070 }
2071 
GetMatchLauncherAbilityInfosForCloneInfos(const InnerBundleInfo & info,const AbilityInfo & abilityInfo,const InnerBundleUserInfo & bundleUserInfo,std::vector<AbilityInfo> & abilityInfos) const2072 void BundleDataMgr::GetMatchLauncherAbilityInfosForCloneInfos(
2073     const InnerBundleInfo& info,
2074     const AbilityInfo &abilityInfo,
2075     const InnerBundleUserInfo &bundleUserInfo,
2076     std::vector<AbilityInfo>& abilityInfos) const
2077 {
2078     for (const auto &item : bundleUserInfo.cloneInfos) {
2079         APP_LOGD("bundleName:%{public}s appIndex:%{public}d start", info.GetBundleName().c_str(), item.second.appIndex);
2080         AbilityInfo cloneAbilityInfo = abilityInfo;
2081         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2082             bundleUserInfo.bundleUserInfo.userId, cloneAbilityInfo.applicationInfo, item.second.appIndex);
2083         cloneAbilityInfo.installTime = item.second.installTime;
2084         cloneAbilityInfo.uid = item.second.uid;
2085         cloneAbilityInfo.appIndex = item.second.appIndex;
2086         // fix labelId or iconId is equal 0
2087         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), cloneAbilityInfo);
2088         abilityInfos.emplace_back(cloneAbilityInfo);
2089     }
2090 }
2091 
ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,ApplicationInfo & applicationInfo) const2092 void BundleDataMgr::ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2093     ApplicationInfo &applicationInfo) const
2094 {
2095     applicationInfo.accessTokenId = cloneInfo.accessTokenId;
2096     applicationInfo.accessTokenIdEx = cloneInfo.accessTokenIdEx;
2097     applicationInfo.enabled = cloneInfo.enabled;
2098     applicationInfo.uid = cloneInfo.uid;
2099     applicationInfo.appIndex = cloneInfo.appIndex;
2100 }
2101 
ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,BundleInfo & bundleInfo) const2102 void BundleDataMgr::ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2103     BundleInfo &bundleInfo) const
2104 {
2105     bundleInfo.uid = cloneInfo.uid;
2106     bundleInfo.gid = cloneInfo.uid; // no gids, need add
2107     bundleInfo.installTime = cloneInfo.installTime;
2108     bundleInfo.appIndex = cloneInfo.appIndex;
2109     if (!bundleInfo.applicationInfo.bundleName.empty()) {
2110         ModifyApplicationInfoByCloneInfo(cloneInfo, bundleInfo.applicationInfo);
2111     }
2112 }
2113 
GetCloneBundleInfos(const InnerBundleInfo & info,int32_t flags,int32_t userId,BundleInfo & bundleInfo,std::vector<BundleInfo> & bundleInfos) const2114 void BundleDataMgr::GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId,
2115     BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const
2116 {
2117     // get clone bundle info
2118     InnerBundleUserInfo bundleUserInfo;
2119     (void)info.GetInnerBundleUserInfo(userId, bundleUserInfo);
2120     if (bundleUserInfo.cloneInfos.empty()) {
2121         return;
2122     }
2123     LOG_D(BMS_TAG_QUERY, "app %{public}s start get bundle clone info",
2124         info.GetBundleName().c_str());
2125     for (const auto &item : bundleUserInfo.cloneInfos) {
2126         BundleInfo cloneBundleInfo;
2127         ErrCode ret = info.GetBundleInfoV9(flags, cloneBundleInfo, userId, item.second.appIndex);
2128         if (ret == ERR_OK) {
2129             ProcessCertificate(cloneBundleInfo, info.GetBundleName(), flags);
2130             ProcessBundleMenu(cloneBundleInfo, flags, true);
2131             ProcessBundleRouterMap(cloneBundleInfo, flags);
2132             bundleInfos.emplace_back(cloneBundleInfo);
2133         }
2134     }
2135 }
2136 
GetBundleNameAndIndexByName(const std::string & keyName,std::string & bundleName,int32_t & appIndex) const2137 void BundleDataMgr::GetBundleNameAndIndexByName(
2138     const std::string &keyName, std::string &bundleName, int32_t &appIndex) const
2139 {
2140     bundleName = keyName;
2141     appIndex = 0;
2142     // for clone bundle name
2143     auto pos = keyName.find(CLONE_BUNDLE_PREFIX);
2144     if ((pos == std::string::npos) || (pos == 0)) {
2145         return;
2146     }
2147     std::string index = keyName.substr(0, pos);
2148     if (!OHOS::StrToInt(index, appIndex)) {
2149         appIndex = 0;
2150         return;
2151     }
2152     bundleName = keyName.substr(pos + strlen(CLONE_BUNDLE_PREFIX));
2153 }
2154 
GetCloneAppIndexes(const std::string & bundleName,int32_t userId) const2155 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const
2156 {
2157     std::vector<int32_t> cloneAppIndexes;
2158     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2159     if (userId == Constants::ANY_USERID) {
2160         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2161             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2162             return cloneAppIndexes;
2163         }
2164         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2165     }
2166     int32_t requestUserId = GetUserId(userId);
2167     if (requestUserId == Constants::INVALID_USERID) {
2168         return cloneAppIndexes;
2169     }
2170     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2171     auto infoItem = bundleInfos_.find(bundleName);
2172     if (infoItem == bundleInfos_.end()) {
2173         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2174         return cloneAppIndexes;
2175     }
2176     const InnerBundleInfo &bundleInfo = infoItem->second;
2177     InnerBundleUserInfo innerBundleUserInfo;
2178     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2179         return cloneAppIndexes;
2180     }
2181     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2182     if (cloneInfos.empty()) {
2183         return cloneAppIndexes;
2184     }
2185     for (const auto &cloneInfo : cloneInfos) {
2186         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes: %{public}d", cloneInfo.second.appIndex);
2187         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2188     }
2189     return cloneAppIndexes;
2190 }
2191 
GetCloneAppIndexes(const std::string & bundleName) const2192 std::set<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName) const
2193 {
2194     std::set<int32_t> cloneAppIndexes;
2195     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2196     auto infoItem = bundleInfos_.find(bundleName);
2197     if (infoItem == bundleInfos_.end()) {
2198         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2199         return cloneAppIndexes;
2200     }
2201     return infoItem->second.GetCloneBundleAppIndexes();
2202 }
2203 
GetCloneAppIndexesNoLock(const std::string & bundleName,int32_t userId) const2204 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const
2205 {
2206     std::vector<int32_t> cloneAppIndexes;
2207     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2208     if (userId == Constants::ANY_USERID) {
2209         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2210             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2211             return cloneAppIndexes;
2212         }
2213         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2214     }
2215     int32_t requestUserId = GetUserId(userId);
2216     if (requestUserId == Constants::INVALID_USERID) {
2217         return cloneAppIndexes;
2218     }
2219     auto infoItem = bundleInfos_.find(bundleName);
2220     if (infoItem == bundleInfos_.end()) {
2221         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2222         return cloneAppIndexes;
2223     }
2224     const InnerBundleInfo &bundleInfo = infoItem->second;
2225     InnerBundleUserInfo innerBundleUserInfo;
2226     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2227         return cloneAppIndexes;
2228     }
2229     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2230     if (cloneInfos.empty()) {
2231         return cloneAppIndexes;
2232     }
2233     for (const auto &cloneInfo : cloneInfos) {
2234         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes unLock: %{public}d", cloneInfo.second.appIndex);
2235         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2236     }
2237     return cloneAppIndexes;
2238 }
2239 
AddAppDetailAbilityInfo(InnerBundleInfo & info) const2240 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
2241 {
2242     InnerAbilityInfo appDetailAbility;
2243     appDetailAbility.name = ServiceConstants::APP_DETAIL_ABILITY;
2244     appDetailAbility.bundleName = info.GetBundleName();
2245     appDetailAbility.enabled = true;
2246     appDetailAbility.type = AbilityType::PAGE;
2247     appDetailAbility.isNativeAbility = true;
2248 
2249     ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
2250     appDetailAbility.applicationName = applicationInfo.name;
2251     appDetailAbility.labelId = applicationInfo.labelResource.id;
2252     if (!info.GetIsNewVersion()) {
2253         appDetailAbility.labelId = 0;
2254         appDetailAbility.label = info.GetBundleName();
2255     }
2256     appDetailAbility.iconId = applicationInfo.iconResource.id;
2257     appDetailAbility.moduleName = applicationInfo.iconResource.moduleName;
2258 
2259     if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
2260         LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo appDetailAbility.iconId is 0");
2261         // get system resource icon Id
2262         auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
2263         if (iter != bundleInfos_.end()) {
2264             LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo get system resource iconId");
2265             appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
2266         } else {
2267             LOG_W(BMS_TAG_QUERY, "AddAppDetailAbilityInfo error: ohos.global.systemres does not exist");
2268         }
2269     }
2270     // not show in the mission list
2271     appDetailAbility.removeMissionAfterTerminate = true;
2272     // set hapPath, for label resource
2273     auto innerModuleInfo = info.GetInnerModuleInfoByModuleName(appDetailAbility.moduleName);
2274     if (innerModuleInfo) {
2275         appDetailAbility.package = innerModuleInfo->modulePackage;
2276         appDetailAbility.hapPath = innerModuleInfo->hapPath;
2277     }
2278     appDetailAbility.visible = true;
2279     std::string keyName;
2280     keyName.append(appDetailAbility.bundleName).append(".")
2281         .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
2282     info.InsertAbilitiesInfo(keyName, appDetailAbility);
2283 }
2284 
GetAllLauncherAbility(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2285 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2286     const int32_t userId, const int32_t requestUserId) const
2287 {
2288     for (const auto &item : bundleInfos_) {
2289         const InnerBundleInfo &info = item.second;
2290         if (info.IsDisabled()) {
2291             LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2292             continue;
2293         }
2294         if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2295             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
2296             continue;
2297         }
2298         if (info.GetBaseBundleInfo().entryInstallationFree) {
2299             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon",
2300                 info.GetBundleName().c_str());
2301             continue;
2302         }
2303 
2304         // get installTime from innerBundleUserInfo
2305         int64_t installTime = 0;
2306         std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2307         std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2308         std::string userOneKey = info.GetBundleName() + "_" + std::to_string(1);
2309         auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2310             [&userIdKey, &userZeroKey, &userOneKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2311             return (infoMap.first == userIdKey || infoMap.first == userZeroKey || infoMap.first == userOneKey);
2312         });
2313         if (iter != info.GetInnerBundleUserInfos().end()) {
2314             installTime = iter->second.installTime;
2315         }
2316         GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
2317     }
2318 }
2319 
GetLauncherAbilityByBundleName(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2320 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2321     const int32_t userId, const int32_t requestUserId) const
2322 {
2323     ElementName element = want.GetElement();
2324     std::string bundleName = element.GetBundleName();
2325     const auto &item = bundleInfos_.find(bundleName);
2326     if (item == bundleInfos_.end()) {
2327         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2328         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2329     }
2330     const InnerBundleInfo &info = item->second;
2331     if (info.IsDisabled()) {
2332         LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2333         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
2334     }
2335     if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2336         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2337         return ERR_OK;
2338     }
2339     if (info.GetBaseBundleInfo().entryInstallationFree) {
2340         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2341         return ERR_OK;
2342     }
2343     // get installTime from innerBundleUserInfo
2344     int64_t installTime = 0;
2345     std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2346     std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2347     std::string userOneKey = info.GetBundleName() + "_" + std::to_string(1);
2348     auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2349         [&userIdKey, &userZeroKey, &userOneKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2350         return (infoMap.first == userIdKey || infoMap.first == userZeroKey || infoMap.first == userOneKey);
2351     });
2352     if (iter != info.GetInnerBundleUserInfos().end()) {
2353         installTime = iter->second.installTime;
2354     }
2355     GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2356     FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2357     return ERR_OK;
2358 }
2359 
QueryLauncherAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2360 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
2361     const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
2362 {
2363     int32_t requestUserId = GetUserId(userId);
2364     if (requestUserId == Constants::INVALID_USERID) {
2365         LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2366         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2367     }
2368     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2369     if (bundleInfos_.empty()) {
2370         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
2371         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2372     }
2373 
2374     ElementName element = want.GetElement();
2375     std::string bundleName = element.GetBundleName();
2376     if (bundleName.empty()) {
2377         // query all launcher ability
2378         GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
2379         return ERR_OK;
2380     }
2381     // query definite abilities by bundle name
2382     ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
2383     if (ret == ERR_OK) {
2384         LOG_D(BMS_TAG_QUERY, "ability infos have been found");
2385     }
2386     return ret;
2387 }
2388 
GetLauncherAbilityInfoSync(const Want & want,const int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2389 ErrCode BundleDataMgr::GetLauncherAbilityInfoSync(const Want &want, const int32_t userId,
2390     std::vector<AbilityInfo> &abilityInfos) const
2391 {
2392     int32_t requestUserId = GetUserId(userId);
2393     if (requestUserId == Constants::INVALID_USERID) {
2394         LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2395         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2396     }
2397     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2398     ElementName element = want.GetElement();
2399     std::string bundleName = element.GetBundleName();
2400     const auto &item = bundleInfos_.find(bundleName);
2401     if (item == bundleInfos_.end()) {
2402         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2403         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2404     }
2405     const InnerBundleInfo &info = item->second;
2406     if(!BundlePermissionMgr::IsSystemApp()){
2407         int32_t responseUserId = info.GetResponseUserId(userId);
2408         if (responseUserId == Constants::INVALID_USERID) {
2409             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2410         }
2411     }
2412     if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2413         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2414         return ERR_OK;
2415     }
2416     if (info.GetBaseBundleInfo().entryInstallationFree) {
2417         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2418         return ERR_OK;
2419     }
2420     // get installTime from innerBundleUserInfo
2421     int64_t installTime = 0;
2422     std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2423     std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2424     std::string userOneKey = info.GetBundleName() + "_" + std::to_string(1);
2425     auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2426         [&userIdKey, &userZeroKey, &userOneKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2427         return (infoMap.first == userIdKey || infoMap.first == userZeroKey || infoMap.first == userOneKey);
2428     });
2429     if (iter != info.GetInnerBundleUserInfos().end()) {
2430         installTime = iter->second.installTime;
2431     }
2432     GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2433     FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2434     return ERR_OK;
2435 }
2436 
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo) const2437 bool BundleDataMgr::QueryAbilityInfoByUri(
2438     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
2439 {
2440     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2441     int32_t requestUserId = GetUserId(userId);
2442     if (requestUserId == Constants::INVALID_USERID) {
2443         return false;
2444     }
2445 
2446     if (abilityUri.empty()) {
2447         return false;
2448     }
2449     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2450         return false;
2451     }
2452     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2453     if (bundleInfos_.empty()) {
2454         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2455         return false;
2456     }
2457     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2458     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2459     if (posFirstSeparator == std::string::npos) {
2460         return false;
2461     }
2462     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2463     std::string uri;
2464     if (posSecondSeparator == std::string::npos) {
2465         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2466     } else {
2467         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2468     }
2469     for (const auto &item : bundleInfos_) {
2470         const InnerBundleInfo &info = item.second;
2471         if (info.IsDisabled()) {
2472             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2473             continue;
2474         }
2475 
2476         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2477         if (!info.GetApplicationEnabled(responseUserId)) {
2478             continue;
2479         }
2480 
2481         auto ability = info.FindAbilityInfoByUri(uri);
2482         if (!ability) {
2483             continue;
2484         }
2485 
2486         abilityInfo = (*ability);
2487         info.GetApplicationInfo(
2488             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
2489             abilityInfo.applicationInfo);
2490         return true;
2491     }
2492 
2493     LOG_W(BMS_TAG_QUERY, "query abilityUri(%{private}s) failed", abilityUri.c_str());
2494     return false;
2495 }
2496 
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)2497 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
2498 {
2499     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2500     if (abilityUri.empty()) {
2501         return false;
2502     }
2503     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2504         return false;
2505     }
2506     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2507     if (bundleInfos_.empty()) {
2508         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2509         return false;
2510     }
2511     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2512     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2513     if (posFirstSeparator == std::string::npos) {
2514         return false;
2515     }
2516     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2517     std::string uri;
2518     if (posSecondSeparator == std::string::npos) {
2519         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2520     } else {
2521         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2522     }
2523 
2524     for (auto &item : bundleInfos_) {
2525         InnerBundleInfo &info = item.second;
2526         if (info.IsDisabled()) {
2527             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2528             continue;
2529         }
2530         info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
2531     }
2532     if (abilityInfos.size() == 0) {
2533         return false;
2534     }
2535 
2536     return true;
2537 }
2538 
GetApplicationInfo(const std::string & appName,int32_t flags,const int userId,ApplicationInfo & appInfo) const2539 bool BundleDataMgr::GetApplicationInfo(
2540     const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
2541 {
2542     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2543     int32_t requestUserId = GetUserId(userId);
2544     if (requestUserId == Constants::INVALID_USERID) {
2545         return false;
2546     }
2547 
2548     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2549     InnerBundleInfo innerBundleInfo;
2550     if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
2551         LOG_D(BMS_TAG_QUERY, "GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
2552         return false;
2553     }
2554 
2555     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2556     innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
2557     return true;
2558 }
2559 
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo,const int32_t appIndex) const2560 ErrCode BundleDataMgr::GetApplicationInfoV9(
2561     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const
2562 {
2563     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2564     int32_t requestUserId = GetUserId(userId);
2565     if (requestUserId == Constants::INVALID_USERID) {
2566         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2567     }
2568 
2569     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2570     InnerBundleInfo innerBundleInfo;
2571     int32_t flag = 0;
2572     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2573         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2574         flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2575     }
2576     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId, appIndex);
2577     if (ret != ERR_OK) {
2578         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2579             appName.c_str(), requestUserId, appIndex);
2580         return ret;
2581     }
2582 
2583     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2584     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo, appIndex);
2585     if (ret != ERR_OK) {
2586         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2587             appName.c_str(), responseUserId, appIndex);
2588         return ret;
2589     }
2590     return ret;
2591 }
2592 
GetApplicationInfoWithResponseId(const std::string & appName,int32_t flags,int32_t & userId,ApplicationInfo & appInfo) const2593 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
2594     const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
2595 {
2596     int32_t requestUserId = GetUserId(userId);
2597     if (requestUserId == Constants::INVALID_USERID) {
2598         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2599     }
2600 
2601     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2602     InnerBundleInfo innerBundleInfo;
2603     int32_t flag = 0;
2604     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2605         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2606         flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2607     }
2608     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
2609     if (ret != ERR_OK) {
2610         LOG_D(BMS_TAG_QUERY,
2611             "GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
2612             appName.c_str(), requestUserId);
2613         return ret;
2614     }
2615 
2616     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2617     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
2618     if (ret != ERR_OK) {
2619         LOG_D(BMS_TAG_QUERY,
2620             "GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
2621             appName.c_str(), responseUserId);
2622         return ret;
2623     }
2624     userId = responseUserId;
2625     return ret;
2626 }
2627 
GetCloneAppInfo(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2628 void BundleDataMgr::GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2629     std::vector<ApplicationInfo> &appInfos) const
2630 {
2631     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2632     for (int32_t appIndex : appIndexVec) {
2633         bool isEnabled = false;
2634         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2635         if (ret != ERR_OK) {
2636             continue;
2637         }
2638         if (isEnabled || (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2639             ApplicationInfo cloneAppInfo;
2640             info.GetApplicationInfo(flags, userId, cloneAppInfo, appIndex);
2641             if (cloneAppInfo.appIndex == appIndex) {
2642                 appInfos.emplace_back(cloneAppInfo);
2643             }
2644         }
2645     }
2646 }
2647 
GetApplicationInfos(int32_t flags,const int userId,std::vector<ApplicationInfo> & appInfos) const2648 bool BundleDataMgr::GetApplicationInfos(
2649     int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
2650 {
2651     int32_t requestUserId = GetUserId(userId);
2652     if (requestUserId == Constants::INVALID_USERID) {
2653         return false;
2654     }
2655 
2656     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2657     if (bundleInfos_.empty()) {
2658         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2659         return false;
2660     }
2661 
2662     for (const auto &item : bundleInfos_) {
2663         const InnerBundleInfo &info = item.second;
2664         if (info.IsDisabled()) {
2665             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2666             continue;
2667         }
2668         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2669         if (info.GetApplicationEnabled(responseUserId) ||
2670             (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2671             ApplicationInfo appInfo;
2672             info.GetApplicationInfo(flags, responseUserId, appInfo);
2673             appInfos.emplace_back(appInfo);
2674         }
2675         GetCloneAppInfo(info, responseUserId, flags, appInfos);
2676     }
2677     LOG_D(BMS_TAG_QUERY, "get installed bundles success");
2678     return !appInfos.empty();
2679 }
2680 
UpateExtResources(const std::string & bundleName,const std::vector<ExtendResourceInfo> & extendResourceInfos)2681 bool BundleDataMgr::UpateExtResources(const std::string &bundleName,
2682     const std::vector<ExtendResourceInfo> &extendResourceInfos)
2683 {
2684     if (bundleName.empty()) {
2685         APP_LOGW("bundleName is empty");
2686         return false;
2687     }
2688 
2689     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2690     auto infoItem = bundleInfos_.find(bundleName);
2691     if (infoItem == bundleInfos_.end()) {
2692         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2693         return false;
2694     }
2695 
2696     auto info = infoItem->second;
2697     info.AddExtendResourceInfos(extendResourceInfos);
2698     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2699         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2700         return false;
2701     }
2702 
2703     bundleInfos_.at(bundleName) = info;
2704     return true;
2705 }
2706 
RemoveExtResources(const std::string & bundleName,const std::vector<std::string> & moduleNames)2707 bool BundleDataMgr::RemoveExtResources(const std::string &bundleName,
2708     const std::vector<std::string> &moduleNames)
2709 {
2710     if (bundleName.empty()) {
2711         APP_LOGW("bundleName is empty");
2712         return false;
2713     }
2714 
2715     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2716     auto infoItem = bundleInfos_.find(bundleName);
2717     if (infoItem == bundleInfos_.end()) {
2718         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2719         return false;
2720     }
2721 
2722     auto info = infoItem->second;
2723     info.RemoveExtendResourceInfos(moduleNames);
2724     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2725         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2726         return false;
2727     }
2728 
2729     bundleInfos_.at(bundleName) = info;
2730     return true;
2731 }
2732 
GetExtendResourceInfo(const std::string & bundleName,const std::string & moduleName,ExtendResourceInfo & extendResourceInfo)2733 ErrCode BundleDataMgr::GetExtendResourceInfo(
2734     const std::string &bundleName, const std::string &moduleName,
2735     ExtendResourceInfo &extendResourceInfo)
2736 {
2737     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2738     auto infoItem = bundleInfos_.find(bundleName);
2739     if (infoItem == bundleInfos_.end()) {
2740         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
2741         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2742     }
2743     auto extendResourceInfos = infoItem->second.GetExtendResourceInfos();
2744     auto iter = extendResourceInfos.find(moduleName);
2745     if (iter == extendResourceInfos.end()) {
2746         APP_LOGE("can not find module %{public}s", moduleName.c_str());
2747         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
2748     }
2749     extendResourceInfo = iter->second;
2750     return ERR_OK;
2751 }
2752 
UpateCurDynamicIconModule(const std::string & bundleName,const std::string & moduleName,const int32_t userId,const int32_t appIndex)2753 bool BundleDataMgr::UpateCurDynamicIconModule(
2754     const std::string &bundleName, const std::string &moduleName, const int32_t userId, const int32_t appIndex)
2755 {
2756     if (bundleName.empty()) {
2757         APP_LOGW("bundleName is empty");
2758         return false;
2759     }
2760 
2761     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2762     auto infoItem = bundleInfos_.find(bundleName);
2763     if (infoItem == bundleInfos_.end()) {
2764         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2765         return false;
2766     }
2767 
2768     auto info = infoItem->second;
2769     info.SetCurDynamicIconModule(moduleName, userId, appIndex);
2770     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2771         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2772         return false;
2773     }
2774 
2775     bundleInfos_.at(bundleName) = info;
2776     return true;
2777 }
2778 
GetCloneAppInfoV9(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2779 void BundleDataMgr::GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2780     std::vector<ApplicationInfo> &appInfos) const
2781 {
2782     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2783     for (int32_t appIndex : appIndexVec) {
2784         bool isEnabled = false;
2785         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2786         if (ret != ERR_OK) {
2787             continue;
2788         }
2789         if (isEnabled || (static_cast<uint32_t>(flags) &
2790             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2791             ApplicationInfo cloneAppInfo;
2792             ret = info.GetApplicationInfoV9(flags, userId, cloneAppInfo, appIndex);
2793             if (ret == ERR_OK) {
2794                 appInfos.emplace_back(cloneAppInfo);
2795             }
2796         }
2797     }
2798 }
2799 
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos) const2800 ErrCode BundleDataMgr::GetApplicationInfosV9(
2801     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
2802 {
2803     int32_t requestUserId = GetUserId(userId);
2804     if (requestUserId == Constants::INVALID_USERID) {
2805         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2806     }
2807 
2808     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2809     if (bundleInfos_.empty()) {
2810         APP_LOGW("bundleInfos_ data is empty");
2811         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2812     }
2813     for (const auto &item : bundleInfos_) {
2814         const InnerBundleInfo &info = item.second;
2815         if (info.IsDisabled()) {
2816             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2817             continue;
2818         }
2819         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2820         if (info.GetApplicationEnabled(responseUserId) ||
2821             (static_cast<uint32_t>(flags) &
2822             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2823             ApplicationInfo appInfo;
2824             if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) == ERR_OK) {
2825                 appInfos.emplace_back(appInfo);
2826             }
2827         }
2828         GetCloneAppInfoV9(info, responseUserId, flags, appInfos);
2829     }
2830     APP_LOGD("get installed bundles success");
2831     return ERR_OK;
2832 }
2833 
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const2834 bool BundleDataMgr::GetBundleInfo(
2835     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
2836 {
2837     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2838     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2839     if (userId == Constants::ANY_USERID) {
2840         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2841             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2842             return false;
2843         }
2844         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2845     }
2846 
2847     int32_t requestUserId = GetUserId(userId);
2848     if (requestUserId == Constants::INVALID_USERID) {
2849         return false;
2850     }
2851     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2852     InnerBundleInfo innerBundleInfo;
2853     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
2854         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d",
2855             bundleName.c_str(), requestUserId);
2856         return false;
2857     }
2858     // for only one user, bundle info can not be obtained during installation
2859     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2860         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2861         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2862             bundleName.c_str(), requestUserId);
2863         return false;
2864     }
2865 
2866     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2867     innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
2868 
2869     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
2870         ProcessBundleMenu(bundleInfo, flags, false);
2871     }
2872     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) ==
2873         BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) {
2874         ProcessBundleRouterMap(bundleInfo, static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
2875             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP));
2876     }
2877     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2878         bundleName.c_str(), userId);
2879     return true;
2880 }
2881 
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId,int32_t appIndex) const2882 ErrCode BundleDataMgr::GetBundleInfoV9(
2883     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const
2884 {
2885     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2886 
2887     if (userId == Constants::ANY_USERID) {
2888         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2889         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2890             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2891             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2892         }
2893         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2894     }
2895 
2896     int32_t requestUserId = GetUserId(userId);
2897     if (requestUserId == Constants::INVALID_USERID) {
2898         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2899     }
2900 
2901     int32_t originalUserId = requestUserId;
2902     PreProcessAnyUserFlag(bundleName, flags, requestUserId);
2903     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
2904     InnerBundleInfo innerBundleInfo;
2905 
2906     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
2907     if (ret != ERR_OK) {
2908         LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s",
2909             ret, bundleName.c_str());
2910         return ret;
2911     }
2912     // for only one user, bundle info can not be obtained during installation
2913     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2914         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2915         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2916             bundleName.c_str(), requestUserId);
2917         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2918     }
2919 
2920     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2921     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
2922     PostProcessAnyUserFlags(flags, responseUserId, originalUserId, bundleInfo, innerBundleInfo);
2923 
2924     ProcessCertificate(bundleInfo, bundleName, flags);
2925     ProcessBundleMenu(bundleInfo, flags, true);
2926     ProcessBundleRouterMap(bundleInfo, flags);
2927     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2928         bundleName.c_str(), userId);
2929     return ERR_OK;
2930 }
2931 
BatchGetBundleInfo(const std::vector<std::string> & bundleNames,int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2932 void BundleDataMgr::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
2933     std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2934 {
2935     for (const auto &bundleName : bundleNames) {
2936         BundleInfo bundleInfo;
2937         ErrCode ret = GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2938         if (ret != ERR_OK) {
2939             continue;
2940         }
2941         bundleInfos.push_back(bundleInfo);
2942     }
2943 }
2944 
GetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2945 ErrCode BundleDataMgr::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2946 {
2947     int32_t uid = IPCSkeleton::GetCallingUid();
2948     int32_t appIndex = 0;
2949     InnerBundleInfo innerBundleInfo;
2950     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
2951         if (sandboxAppHelper_ == nullptr) {
2952             LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfoForSelf failed uid:%{public}d", uid);
2953             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2954         }
2955         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2956             LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfoForSelf failed uid:%{public}d", uid);
2957             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2958         }
2959     }
2960     int32_t userId = uid / Constants::BASE_USER_RANGE;
2961     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, userId, appIndex);
2962     ProcessCertificate(bundleInfo, innerBundleInfo.GetBundleName(), flags);
2963     ProcessBundleMenu(bundleInfo, flags, true);
2964     ProcessBundleRouterMap(bundleInfo, flags);
2965     LOG_D(BMS_TAG_QUERY, "get bundleInfoForSelf %{public}s successfully in user %{public}d",
2966         innerBundleInfo.GetBundleName().c_str(), userId);
2967     return ERR_OK;
2968 }
2969 
ProcessBundleMenu(BundleInfo & bundleInfo,int32_t flags,bool clearData) const2970 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
2971 {
2972     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
2973     if (clearData) {
2974         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2975             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2976             return ERR_OK;
2977         }
2978         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
2979             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
2980             APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
2981             std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
2982                 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
2983             });
2984             return ERR_OK;
2985         }
2986     }
2987     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2988         std::string menuProfile = hapModuleInfo.fileContextMenu;
2989         auto pos = menuProfile.find(PROFILE_PREFIX);
2990         if (pos == std::string::npos) {
2991             APP_LOGD("invalid menu profile");
2992             continue;
2993         }
2994         std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
2995         std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
2996 
2997         std::string menuProfileContent;
2998         GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
2999         hapModuleInfo.fileContextMenu = menuProfileContent;
3000     }
3001     return ERR_OK;
3002 }
3003 
ProcessBundleRouterMap(BundleInfo & bundleInfo,int32_t flag) const3004 void BundleDataMgr::ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const
3005 {
3006     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
3007     if (routerStorage_ == nullptr) {
3008         APP_LOGE("routerStorage_ is null");
3009         return;
3010     }
3011     APP_LOGD("ProcessBundleRouterMap with flags: %{public}d", flag);
3012     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
3013         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
3014         return;
3015     }
3016     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP))
3017         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP)) {
3018         return;
3019     }
3020     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
3021         std::string routerPath = hapModuleInfo.routerMap;
3022         auto pos = routerPath.find(PROFILE_PREFIX);
3023         if (pos == std::string::npos) {
3024             APP_LOGD("invalid router profile");
3025             continue;
3026         }
3027         if (!routerStorage_->GetRouterInfo(bundleInfo.name, hapModuleInfo.moduleName, hapModuleInfo.routerArray)) {
3028             APP_LOGE("get failed for %{public}s", hapModuleInfo.moduleName.c_str());
3029             continue;
3030         }
3031     }
3032     RouterMapHelper::MergeRouter(bundleInfo);
3033 }
3034 
ProcessCertificate(BundleInfo & bundleInfo,const std::string & bundleName,int32_t flags) const3035 void BundleDataMgr::ProcessCertificate(BundleInfo& bundleInfo, const std::string &bundleName, int32_t flags) const
3036 {
3037     if ((static_cast<uint32_t>(flags) &
3038         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO))
3039         == static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) {
3040         AppProvisionInfo appProvisionInfo;
3041         if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->
3042             GetAppProvisionInfo(bundleName, appProvisionInfo)) {
3043             APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
3044             return;
3045         }
3046         bundleInfo.signatureInfo.certificate = appProvisionInfo.certificate;
3047     }
3048 }
3049 
DeleteRouterInfo(const std::string & bundleName,const std::string & moduleName)3050 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName, const std::string &moduleName)
3051 {
3052     if (routerStorage_ == nullptr) {
3053         APP_LOGE("routerStorage_ is null");
3054         return false;
3055     }
3056     return routerStorage_->DeleteRouterInfo(bundleName, moduleName);
3057 }
3058 
DeleteRouterInfo(const std::string & bundleName)3059 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName)
3060 {
3061     if (routerStorage_ == nullptr) {
3062         APP_LOGE("routerStorage_ is null");
3063         return false;
3064     }
3065     return routerStorage_->DeleteRouterInfo(bundleName);
3066 }
3067 
UpdateRouterInfo(const std::string & bundleName)3068 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName)
3069 {
3070     if (routerStorage_ == nullptr) {
3071         APP_LOGE("routerStorage_ is null");
3072         return;
3073     }
3074     std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
3075     {
3076         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3077         const auto infoItem = bundleInfos_.find(bundleName);
3078         if (infoItem == bundleInfos_.end()) {
3079             APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
3080             return;
3081         }
3082         FindRouterHapPath(infoItem->second, hapPathMap);
3083     }
3084     UpdateRouterInfo(bundleName, hapPathMap);
3085 }
3086 
FindRouterHapPath(const InnerBundleInfo & innerBundleInfo,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)3087 void BundleDataMgr::FindRouterHapPath(const InnerBundleInfo &innerBundleInfo,
3088     std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
3089 {
3090     auto moduleMap = innerBundleInfo.GetInnerModuleInfos();
3091     for (auto it = moduleMap.begin(); it != moduleMap.end(); it++) {
3092         std::string routerPath = it->second.routerMap;
3093         auto pos = routerPath.find(PROFILE_PREFIX);
3094         if (pos == std::string::npos) {
3095             continue;
3096         }
3097         std::string routerJsonName = routerPath.substr(pos + PROFILE_PREFIX_LENGTH);
3098         std::string routerJsonPath = PROFILE_PATH + routerJsonName + JSON_SUFFIX;
3099         hapPathMap[it->second.moduleName] = std::make_pair(it->second.hapPath, routerJsonPath);
3100     }
3101 }
3102 
UpdateRouterInfo(InnerBundleInfo & innerBundleInfo)3103 void BundleDataMgr::UpdateRouterInfo(InnerBundleInfo &innerBundleInfo)
3104 {
3105     std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
3106     FindRouterHapPath(innerBundleInfo, hapPathMap);
3107     UpdateRouterInfo(innerBundleInfo.GetBundleName(), hapPathMap);
3108 }
3109 
UpdateRouterInfo(const std::string & bundleName,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)3110 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName,
3111     std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
3112 {
3113     std::map<std::string, std::string> routerInfoMap;
3114     for (auto hapIter = hapPathMap.begin(); hapIter != hapPathMap.end(); hapIter++) {
3115         std::string routerMapString;
3116         if (GetJsonProfileByExtractor(hapIter->second.first, hapIter->second.second, routerMapString) != ERR_OK) {
3117             APP_LOGW("get json string from %{public}s failed", hapIter->second.second.c_str());
3118             continue;
3119         }
3120         routerInfoMap[hapIter->first] = routerMapString;
3121     }
3122     if (!routerStorage_->UpdateRouterInfo(bundleName, routerInfoMap)) {
3123         APP_LOGW("add router for %{public}s failed", bundleName.c_str());
3124     }
3125 }
3126 
GetAllBundleNames(std::set<std::string> & bundleNames)3127 void BundleDataMgr::GetAllBundleNames(std::set<std::string> &bundleNames)
3128 {
3129     if (routerStorage_ == nullptr) {
3130         APP_LOGE("routerStorage_ is null");
3131         return;
3132     }
3133     return routerStorage_->GetAllBundleNames(bundleNames);
3134 }
3135 
PreProcessAnyUserFlag(const std::string & bundleName,int32_t & flags,int32_t & userId) const3136 void BundleDataMgr::PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const
3137 {
3138     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0) {
3139         flags = static_cast<uint32_t>(
3140             static_cast<uint32_t>(flags) | static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE));
3141         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
3142         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
3143             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
3144             return;
3145         }
3146         if (innerBundleUserInfos.empty()) {
3147             return;
3148         }
3149         for (auto &bundleUserInfo: innerBundleUserInfos) {
3150             if (bundleUserInfo.bundleUserInfo.userId == userId) {
3151                 return;
3152             }
3153             if (bundleUserInfo.bundleUserInfo.userId < Constants::START_USERID) {
3154                 return;
3155             }
3156         }
3157         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
3158     }
3159 }
3160 
PostProcessAnyUserFlags(int32_t flags,int32_t userId,int32_t originalUserId,BundleInfo & bundleInfo,const InnerBundleInfo & innerBundleInfo) const3161 void BundleDataMgr::PostProcessAnyUserFlags(
3162     int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo,
3163     const InnerBundleInfo &innerBundleInfo) const
3164 {
3165     bool withApplicationFlag =
3166         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION))
3167             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
3168     if (withApplicationFlag) {
3169         if (userId >= Constants::START_USERID && userId != originalUserId) {
3170             uint32_t flagInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_INSTALLED);
3171             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3172             if ((applicationFlags & flagInstalled) != 0) {
3173                 bundleInfo.applicationInfo.applicationFlags = static_cast<int32_t>(applicationFlags ^ flagInstalled);
3174             }
3175         }
3176 
3177         bool withAnyUser =
3178             (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER))
3179                 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER);
3180         if (withAnyUser) {
3181             const std::map<std::string, InnerBundleUserInfo>& innerUserInfos
3182                 = innerBundleInfo.GetInnerBundleUserInfos();
3183             uint32_t flagOtherInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_OTHER_INSTALLED);
3184             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3185             if (!innerBundleInfo.HasInnerBundleUserInfo(originalUserId)) {
3186                 bundleInfo.applicationInfo.applicationFlags =
3187                     static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3188             } else if (innerUserInfos.size() > 1) {
3189                 bundleInfo.applicationInfo.applicationFlags =
3190                     static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3191             }
3192         }
3193     }
3194 }
3195 
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,GetDependentBundleInfoFlag flag) const3196 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
3197     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
3198 {
3199     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
3200     if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
3201         (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
3202         // for app service hsp
3203         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3204         std::lock_guard<ffrt::mutex> hspLock(hspBundleNameMutex_);
3205         for (const std::string &hspName : appServiceHspBundleName_) {
3206             APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
3207             auto infoItem = bundleInfos_.find(hspName);
3208             if (infoItem == bundleInfos_.end()) {
3209                 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
3210                 continue;
3211             }
3212             ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
3213         }
3214     }
3215     if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
3216         flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
3217         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3218         auto infoItem = bundleInfos_.find(bundleName);
3219         if (infoItem == bundleInfos_.end()) {
3220             APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
3221             return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
3222                 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
3223         }
3224         const InnerBundleInfo &innerBundleInfo = infoItem->second;
3225         std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
3226         for (const auto &item : dependencies) {
3227             BaseSharedBundleInfo baseSharedBundleInfo;
3228             if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
3229                 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
3230             }
3231         }
3232     }
3233     APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
3234     return ERR_OK;
3235 }
3236 
GetBundleType(const std::string & bundleName,BundleType & bundleType) const3237 bool BundleDataMgr::GetBundleType(const std::string &bundleName, BundleType &bundleType)const
3238 {
3239     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3240     auto item = bundleInfos_.find(bundleName);
3241     if (item == bundleInfos_.end()) {
3242         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3243         return false;
3244     }
3245     bundleType = item->second.GetApplicationBundleType();
3246     APP_LOGI("bundle %{public}s Type is %{public}d", bundleName.c_str(), bundleType);
3247     return true;
3248 }
3249 
GetBaseSharedBundleInfo(const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const3250 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
3251     BaseSharedBundleInfo &baseSharedBundleInfo) const
3252 {
3253     auto infoItem = bundleInfos_.find(dependency.bundleName);
3254     if (infoItem == bundleInfos_.end()) {
3255         APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
3256             dependency.bundleName.c_str());
3257         return false;
3258     }
3259     const InnerBundleInfo &innerBundleInfo = infoItem->second;
3260     if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3261         (void)GetAdaptBaseShareBundleInfo(innerBundleInfo, dependency, baseSharedBundleInfo);
3262     } else {
3263         APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
3264             innerBundleInfo.GetApplicationBundleType());
3265         return false;
3266     }
3267     APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
3268     return true;
3269 }
3270 
GetAdaptBaseShareBundleInfo(const InnerBundleInfo & innerBundleInfo,const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const3271 bool BundleDataMgr::GetAdaptBaseShareBundleInfo(
3272     const InnerBundleInfo &innerBundleInfo,
3273     const Dependency &dependency,
3274     BaseSharedBundleInfo &baseSharedBundleInfo) const
3275 {
3276     // check cross hsp size and calling token
3277     if ((innerBundleInfo.GetAllHspVersion().size() <= 1) || (BundlePermissionMgr::IsNativeTokenType())) {
3278         return innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3279     }
3280     // get running app hsp versionCode
3281     std::map<std::string, uint32_t> shareBundles;
3282     if ((AbilityManagerHelper::QueryRunningSharedBundles(IPCSkeleton::GetCallingPid(), shareBundles) == ERR_OK)) {
3283         auto item = shareBundles.find(dependency.bundleName);
3284         if ((item != shareBundles.end()) && innerBundleInfo.GetBaseSharedBundleInfo(dependency.moduleName,
3285             item->second, baseSharedBundleInfo)) {
3286             APP_LOGI("get share bundle by pid -n %{public}s -v %{public}u succeed",
3287                 dependency.bundleName.c_str(), item->second);
3288             return true;
3289         }
3290     }
3291     return innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3292 }
3293 
DeleteSharedBundleInfo(const std::string & bundleName)3294 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
3295 {
3296     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3297     auto infoItem = bundleInfos_.find(bundleName);
3298     if (infoItem != bundleInfos_.end()) {
3299         APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
3300         const InnerBundleInfo &innerBundleInfo = infoItem->second;
3301         bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
3302         if (!ret) {
3303             APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
3304         }
3305         bundleInfos_.erase(bundleName);
3306         return ret;
3307     }
3308     return false;
3309 }
3310 
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId) const3311 ErrCode BundleDataMgr::GetBundlePackInfo(
3312     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
3313 {
3314     APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
3315     int32_t requestUserId;
3316     if (userId == Constants::UNSPECIFIED_USERID) {
3317         requestUserId = GetUserIdByCallingUid();
3318     } else {
3319         requestUserId = userId;
3320     }
3321 
3322     if (requestUserId == Constants::INVALID_USERID) {
3323         APP_LOGW("getBundlePackInfo userId is invalid");
3324         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3325     }
3326     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3327     InnerBundleInfo innerBundleInfo;
3328     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
3329         APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
3330         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3331     }
3332     BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
3333     if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
3334         bundlePackInfo.packages = innerBundlePackInfo.packages;
3335         return ERR_OK;
3336     }
3337     if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
3338         bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
3339         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3340         return ERR_OK;
3341     }
3342     if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
3343         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3344         return ERR_OK;
3345     }
3346     bundlePackInfo = innerBundlePackInfo;
3347     return ERR_OK;
3348 }
3349 
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos) const3350 bool BundleDataMgr::GetBundleInfosByMetaData(
3351     const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
3352 {
3353     if (metaData.empty()) {
3354         APP_LOGW("bundle name is empty");
3355         return false;
3356     }
3357 
3358     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3359     if (bundleInfos_.empty()) {
3360         APP_LOGW("bundleInfos_ data is empty");
3361         return false;
3362     }
3363 
3364     bool find = false;
3365     int32_t requestUserId = GetUserId();
3366     for (const auto &item : bundleInfos_) {
3367         const InnerBundleInfo &info = item.second;
3368         if (info.IsDisabled()) {
3369             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3370             continue;
3371         }
3372         if (info.CheckSpecialMetaData(metaData)) {
3373             BundleInfo bundleInfo;
3374             int32_t responseUserId = info.GetResponseUserId(requestUserId);
3375             info.GetBundleInfo(
3376                 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3377             bundleInfos.emplace_back(bundleInfo);
3378             find = true;
3379         }
3380     }
3381     return find;
3382 }
3383 
GetBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3384 bool BundleDataMgr::GetBundleList(
3385     std::vector<std::string> &bundleNames, int32_t userId) const
3386 {
3387     int32_t requestUserId = GetUserId(userId);
3388     if (requestUserId == Constants::INVALID_USERID) {
3389         return false;
3390     }
3391 
3392     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3393     if (bundleInfos_.empty()) {
3394         APP_LOGW("bundleInfos_ data is empty");
3395         return false;
3396     }
3397 
3398     bool find = false;
3399     for (const auto &infoItem : bundleInfos_) {
3400         const InnerBundleInfo &innerBundleInfo = infoItem.second;
3401         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3402         if (CheckInnerBundleInfoWithFlags(
3403             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3404             continue;
3405         }
3406 
3407         bundleNames.emplace_back(infoItem.first);
3408         find = true;
3409     }
3410     APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
3411     return find;
3412 }
3413 
GetDebugBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3414 bool BundleDataMgr::GetDebugBundleList(std::vector<std::string> &bundleNames, int32_t userId) const
3415 {
3416     int32_t requestUserId = GetUserId(userId);
3417     if (requestUserId == Constants::INVALID_USERID) {
3418         APP_LOGE("UserId is invalid");
3419         return false;
3420     }
3421 
3422     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3423     if (bundleInfos_.empty()) {
3424         APP_LOGE("bundleInfos_ data is empty");
3425         return false;
3426     }
3427 
3428     for (const auto &infoItem : bundleInfos_) {
3429         const InnerBundleInfo &innerBundleInfo = infoItem.second;
3430         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3431         if (CheckInnerBundleInfoWithFlags(
3432             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3433             continue;
3434         }
3435 
3436         ApplicationInfo appInfo = innerBundleInfo.GetBaseApplicationInfo();
3437         if (appInfo.appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG) {
3438             bundleNames.emplace_back(infoItem.first);
3439         }
3440     }
3441 
3442     bool find = !bundleNames.empty();
3443     APP_LOGD("user(%{public}d) get installed debug bundles list result(%{public}d)", userId, find);
3444     return find;
3445 }
3446 
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3447 bool BundleDataMgr::GetBundleInfos(
3448     int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3449 {
3450     if (userId == Constants::ALL_USERID) {
3451         return GetAllBundleInfos(flags, bundleInfos);
3452     }
3453 
3454     int32_t requestUserId = GetUserId(userId);
3455     if (requestUserId == Constants::INVALID_USERID) {
3456         return false;
3457     }
3458 
3459     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3460     if (bundleInfos_.empty()) {
3461         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3462         return false;
3463     }
3464 
3465     bool find = false;
3466     for (const auto &item : bundleInfos_) {
3467         const InnerBundleInfo &innerBundleInfo = item.second;
3468         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3469             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3470                 innerBundleInfo.GetBundleName().c_str());
3471             continue;
3472         }
3473 
3474         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3475         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
3476             continue;
3477         }
3478 
3479         BundleInfo bundleInfo;
3480         if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
3481             continue;
3482         }
3483 
3484         bundleInfos.emplace_back(bundleInfo);
3485         find = true;
3486         // add clone bundle info
3487         // flags convert
3488         GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3489     }
3490 
3491     LOG_D(BMS_TAG_QUERY, "get bundleInfos result(%{public}d) in user(%{public}d)", find, userId);
3492     return find;
3493 }
3494 
CheckInnerBundleInfoWithFlags(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3495 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
3496     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3497 {
3498     if (userId == Constants::INVALID_USERID) {
3499         APP_LOGD("userId is invalid");
3500         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3501     }
3502     if (innerBundleInfo.IsDisabled()) {
3503         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3504         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3505     }
3506 
3507     if (appIndex == 0) {
3508         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
3509             && !innerBundleInfo.GetApplicationEnabled(userId)) {
3510             APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3511                 innerBundleInfo.GetBundleName().c_str(), userId);
3512             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3513         }
3514     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3515         int32_t requestUserId = GetUserId(userId);
3516         if (requestUserId == Constants::INVALID_USERID) {
3517             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3518         }
3519         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3520         bool isEnabled = false;
3521         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3522         if (ret != ERR_OK) {
3523             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3524         }
3525         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
3526             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3527                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3528             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3529         }
3530     } else {
3531         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3532     }
3533     return ERR_OK;
3534 }
3535 
CheckInnerBundleInfoWithFlagsV9(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3536 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlagsV9(
3537     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3538 {
3539     if (userId == Constants::INVALID_USERID) {
3540         APP_LOGD("userId is invalid");
3541         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3542     }
3543     if (innerBundleInfo.IsDisabled()) {
3544         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3545         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3546     }
3547 
3548     if (appIndex == 0) {
3549         if (!(static_cast<uint32_t>(flags) &
3550             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
3551             bool isEnabled = false;
3552             ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(userId, isEnabled, appIndex);
3553             if (ret != ERR_OK) {
3554                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3555                     innerBundleInfo.GetBundleName().c_str(), userId);
3556                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3557             }
3558             if (!isEnabled) {
3559                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3560                     innerBundleInfo.GetBundleName().c_str(), userId);
3561                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3562             }
3563         }
3564     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3565         int32_t requestUserId = GetUserId(userId);
3566         if (requestUserId == Constants::INVALID_USERID) {
3567             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3568         }
3569         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3570         bool isEnabled = false;
3571         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3572         if (ret != ERR_OK) {
3573             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3574         }
3575         if (!(static_cast<uint32_t>(flags) &
3576             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
3577             && !isEnabled) {
3578             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3579                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3580             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3581         }
3582     } else {
3583         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3584     }
3585     return ERR_OK;
3586 }
3587 
CheckBundleAndAbilityDisabled(const InnerBundleInfo & info,int32_t flags,int32_t userId) const3588 ErrCode BundleDataMgr::CheckBundleAndAbilityDisabled(
3589     const InnerBundleInfo &info, int32_t flags, int32_t userId) const
3590 {
3591     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
3592     int32_t requestUserId = GetUserId(userId);
3593     if (requestUserId == Constants::INVALID_USERID) {
3594         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3595     }
3596 
3597     if (info.IsDisabled()) {
3598         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -f %{public}d",
3599             info.GetBundleName().c_str(), userId, flags);
3600         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3601     }
3602 
3603     int32_t responseUserId = info.GetResponseUserId(requestUserId);
3604     bool isEnabled = false;
3605     auto ret = info.GetApplicationEnabledV9(responseUserId, isEnabled);
3606     if (ret != ERR_OK) {
3607         LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle %{public}s not install in user %{public}d ret:%{public}d",
3608                 info.GetBundleName().c_str(), responseUserId, ret);
3609         return ret;
3610     }
3611     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
3612         && !isEnabled) {
3613         LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -f %{public}d",
3614             info.GetBundleName().c_str(), responseUserId, flags);
3615         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3616     }
3617     return ERR_OK;
3618 }
3619 
GetAllBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3620 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3621 {
3622     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3623     if (bundleInfos_.empty()) {
3624         APP_LOGW("bundleInfos_ data is empty");
3625         return false;
3626     }
3627 
3628     bool find = false;
3629     for (const auto &item : bundleInfos_) {
3630         const InnerBundleInfo &info = item.second;
3631         if (info.IsDisabled()) {
3632             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3633             continue;
3634         }
3635         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3636             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3637             continue;
3638         }
3639         BundleInfo bundleInfo;
3640         info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
3641         bundleInfos.emplace_back(bundleInfo);
3642         find = true;
3643         // add clone bundle info
3644         GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3645     }
3646 
3647     APP_LOGD("get all bundleInfos result(%{public}d)", find);
3648     return find;
3649 }
3650 
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3651 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3652 {
3653     if (userId == Constants::ALL_USERID) {
3654         return GetAllBundleInfosV9(flags, bundleInfos);
3655     }
3656     int32_t requestUserId = GetUserId(userId);
3657     if (requestUserId == Constants::INVALID_USERID) {
3658         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3659     }
3660     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3661     if (bundleInfos_.empty()) {
3662         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3663         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3664     }
3665     bool ofAnyUserFlag =
3666         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0;
3667     for (const auto &item : bundleInfos_) {
3668         const InnerBundleInfo &innerBundleInfo = item.second;
3669         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3670             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3671                 innerBundleInfo.GetBundleName().c_str());
3672             continue;
3673         }
3674         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3675         auto flag = GET_BASIC_APPLICATION_INFO;
3676         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
3677             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
3678             flag = GET_APPLICATION_INFO_WITH_DISABLE;
3679         }
3680         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
3681             auto &hp = innerBundleInfo.GetInnerBundleUserInfos();
3682             if (ofAnyUserFlag && hp.size() > 0) {
3683                 responseUserId = hp.begin()->second.bundleUserInfo.userId;
3684             } else {
3685                 continue;
3686             }
3687         }
3688         uint32_t launchFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY);
3689         if (((static_cast<uint32_t>(flags) & launchFlag) == launchFlag) && (innerBundleInfo.IsHideDesktopIcon())) {
3690             LOG_D(BMS_TAG_QUERY, "bundleName %{public}s is hide desktopIcon",
3691                 innerBundleInfo.GetBundleName().c_str());
3692             continue;
3693         }
3694         uint32_t cloudFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_CLOUD_KIT);
3695         if (((static_cast<uint32_t>(flags) & cloudFlag) == cloudFlag) &&
3696             !innerBundleInfo.GetCloudFileSyncEnabled() &&
3697             !innerBundleInfo.GetCloudStructuredDataSyncEnabled()) {
3698             APP_LOGD("getAllBundleInfosV9 bundleName %{public}s does not enable cloud sync",
3699                 innerBundleInfo.GetBundleName().c_str());
3700             continue;
3701         }
3702         BundleInfo bundleInfo;
3703         if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
3704             continue;
3705         }
3706         ProcessCertificate(bundleInfo, innerBundleInfo.GetBundleName(), flags);
3707         ProcessBundleMenu(bundleInfo, flags, true);
3708         ProcessBundleRouterMap(bundleInfo, flags);
3709         PostProcessAnyUserFlags(flags, responseUserId, requestUserId, bundleInfo, innerBundleInfo);
3710         bundleInfos.emplace_back(bundleInfo);
3711         if (!ofAnyUserFlag && ((static_cast<uint32_t>(flags) &
3712             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3713             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3714             // add clone bundle info
3715             GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3716         }
3717     }
3718     if (bundleInfos.empty()) {
3719         LOG_W(BMS_TAG_QUERY, "bundleInfos is empty");
3720     }
3721     return ERR_OK;
3722 }
3723 
GetAllBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3724 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3725 {
3726     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3727     if (bundleInfos_.empty()) {
3728         APP_LOGW("bundleInfos_ data is empty");
3729         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3730     }
3731 
3732     for (const auto &item : bundleInfos_) {
3733         const InnerBundleInfo &info = item.second;
3734         if (info.IsDisabled()) {
3735             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3736             continue;
3737         }
3738         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3739             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3740             continue;
3741         }
3742         if (((static_cast<uint32_t>(flags) &
3743             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) ==
3744             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) &&
3745             (info.IsHideDesktopIcon())) {
3746             APP_LOGD("getAllBundleInfosV9 bundleName %{public}s is hide desktopIcon",
3747                 info.GetBundleName().c_str());
3748             continue;
3749         }
3750         uint32_t cloudFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_CLOUD_KIT);
3751         if (((static_cast<uint32_t>(flags) & cloudFlag) == cloudFlag) &&
3752             !info.GetCloudFileSyncEnabled() &&
3753             !info.GetCloudStructuredDataSyncEnabled()) {
3754             APP_LOGD("getAllBundleInfosV9 bundleName %{public}s does not enable cloud sync",
3755                 info.GetBundleName().c_str());
3756             continue;
3757         }
3758         BundleInfo bundleInfo;
3759         info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
3760         ProcessCertificate(bundleInfo, info.GetBundleName(), flags);
3761         auto ret = ProcessBundleMenu(bundleInfo, flags, true);
3762         if (ret == ERR_OK) {
3763             bundleInfos.emplace_back(bundleInfo);
3764             if (((static_cast<uint32_t>(flags) &
3765                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3766                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3767                 // add clone bundle info
3768                 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3769             }
3770         }
3771     }
3772     if (bundleInfos.empty()) {
3773         APP_LOGW("bundleInfos is empty");
3774     }
3775     return ERR_OK;
3776 }
3777 
GetBundleNameForUid(const int32_t uid,std::string & bundleName) const3778 bool BundleDataMgr::GetBundleNameForUid(const int32_t uid, std::string &bundleName) const
3779 {
3780     int32_t appIndex = 0;
3781     return GetBundleNameAndIndexForUid(uid, bundleName, appIndex) == ERR_OK;
3782 }
3783 
GetBundleNameAndIndexForUid(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3784 ErrCode BundleDataMgr::GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName,
3785     int32_t &appIndex) const
3786 {
3787     InnerBundleInfo innerBundleInfo;
3788     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
3789         if (sandboxAppHelper_ == nullptr) {
3790             return ERR_BUNDLE_MANAGER_INVALID_UID;
3791         }
3792         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3793             return ERR_BUNDLE_MANAGER_INVALID_UID;
3794         }
3795     }
3796 
3797     bundleName = innerBundleInfo.GetBundleName();
3798     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
3799         uid, bundleName.c_str(), appIndex);
3800     return ERR_OK;
3801 }
3802 
GetBundleNameAndIndex(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3803 ErrCode BundleDataMgr::GetBundleNameAndIndex(const int32_t uid, std::string &bundleName,
3804     int32_t &appIndex) const
3805 {
3806     if (uid < Constants::BASE_APP_UID) {
3807         APP_LOGD("the uid(%{public}d) is not an application", uid);
3808         return ERR_BUNDLE_MANAGER_INVALID_UID;
3809     }
3810     int32_t userId = GetUserIdByUid(uid);
3811     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3812     if (bundleId < 0) {
3813         APP_LOGD("the uid(%{public}d) is not an application", uid);
3814         return ERR_BUNDLE_MANAGER_INVALID_UID;
3815     }
3816 
3817     std::shared_lock<ffrt::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3818     auto bundleIdIter = bundleIdMap_.find(bundleId);
3819     if (bundleIdIter == bundleIdMap_.end()) {
3820         APP_LOGD("bundleId %{public}d is not existed", bundleId);
3821         return ERR_BUNDLE_MANAGER_INVALID_UID;
3822     }
3823     std::string keyName = bundleIdIter->second;
3824     if (keyName.empty()) {
3825         return ERR_BUNDLE_MANAGER_INVALID_UID;
3826     }
3827     // bundleName, sandbox_app: \d+_w+, clone_app: \d+clone_w+, others
3828     if (isdigit(keyName[0])) {
3829         size_t pos = keyName.find_first_not_of("0123456789");
3830         if (pos == std::string::npos) {
3831             return ERR_BUNDLE_MANAGER_INVALID_UID;
3832         }
3833         std::string index = keyName.substr(0, pos);
3834         if (!OHOS::StrToInt(index, appIndex)) {
3835             return ERR_BUNDLE_MANAGER_INVALID_UID;
3836         }
3837 
3838         auto clonePos = keyName.find(CLONE_BUNDLE_PREFIX);
3839         if (clonePos != std::string::npos && clonePos == pos) {
3840             bundleName = keyName.substr(clonePos + strlen(CLONE_BUNDLE_PREFIX));
3841             return ERR_OK;
3842         }
3843 
3844         auto sandboxPos = keyName.find(Constants::FILE_UNDERLINE);
3845         if (sandboxPos != std::string::npos && sandboxPos == pos) {
3846             bundleName = keyName.substr(sandboxPos + strlen(Constants::FILE_UNDERLINE));
3847             return ERR_OK;
3848         }
3849     }
3850 
3851     bundleName = keyName;
3852     appIndex = 0;
3853     return ERR_OK;
3854 }
3855 
GetInnerBundleInfoAndIndexByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo,int32_t & appIndex) const3856 ErrCode BundleDataMgr::GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo,
3857     int32_t &appIndex) const
3858 {
3859     if (uid < Constants::BASE_APP_UID) {
3860         APP_LOGD("the uid(%{public}d) is not an application", uid);
3861         return ERR_BUNDLE_MANAGER_INVALID_UID;
3862     }
3863     int32_t userId = GetUserIdByUid(uid);
3864     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3865 
3866     std::string keyName;
3867     {
3868         std::shared_lock<ffrt::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3869         auto bundleIdIter = bundleIdMap_.find(bundleId);
3870         if (bundleIdIter == bundleIdMap_.end()) {
3871             APP_LOGW_NOFUNC("uid %{public}d is not existed", uid);
3872             return ERR_BUNDLE_MANAGER_INVALID_UID;
3873         }
3874         keyName = bundleIdIter->second;
3875     }
3876     std::string bundleName = keyName;
3877     GetBundleNameAndIndexByName(keyName, bundleName, appIndex);
3878 
3879     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3880     auto bundleInfoIter = bundleInfos_.find(bundleName);
3881     if (bundleInfoIter == bundleInfos_.end()) {
3882         APP_LOGE("bundleName %{public}s is not existed in bundleInfos_", bundleName.c_str());
3883         return ERR_BUNDLE_MANAGER_INVALID_UID;
3884     }
3885     int32_t oriUid = bundleInfoIter->second.GetUid(userId, appIndex);
3886     if (oriUid == uid) {
3887         innerBundleInfo = bundleInfoIter->second;
3888         return ERR_OK;
3889     }
3890 
3891     APP_LOGW("bn %{public}s uid %{public}d oriUid %{public}d ", bundleName.c_str(), uid, oriUid);
3892     return ERR_BUNDLE_MANAGER_INVALID_UID;
3893 }
3894 
GetInnerBundleInfoByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo) const3895 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const
3896 {
3897     int32_t appIndex = 0;
3898     return GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex);
3899 }
3900 
GetRecoverablePreInstallBundleInfos()3901 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
3902 {
3903     std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
3904     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3905     if (userId == Constants::INVALID_USERID) {
3906         APP_LOGW("userId %{public}d is invalid", userId);
3907         return recoverablePreInstallBundleInfos;
3908     }
3909     std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
3910     for (auto preInstallBundleInfo: preInstallBundleInfos) {
3911         if (!preInstallBundleInfo.IsRemovable()) {
3912             continue;
3913         }
3914         if (preInstallBundleInfo.HasForceUninstalledUser(userId)) {
3915             APP_LOGW("-n %{public}s is force unisntalled in -u %{public}d",
3916                 preInstallBundleInfo.GetBundleName().c_str(), userId);
3917             continue;
3918         }
3919         if (BundleUserMgrHostImpl::SkipThirdPreloadAppInstallation(userId, preInstallBundleInfo)) {
3920             continue;
3921         }
3922         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3923         auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
3924         if (infoItem == bundleInfos_.end()) {
3925             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3926             continue;
3927         }
3928         if (infoItem->second.IsU1Enable() &&
3929             !infoItem->second.HasInnerBundleUserInfo(Constants::U1)) {
3930             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3931             continue;
3932         }
3933         if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
3934             !infoItem->second.HasInnerBundleUserInfo(userId)) {
3935             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3936         }
3937     }
3938     return recoverablePreInstallBundleInfos;
3939 }
3940 
IsBundleExist(const std::string & bundleName) const3941 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
3942 {
3943     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3944     return bundleInfos_.find(bundleName) != bundleInfos_.end();
3945 }
3946 
HasUserInstallInBundle(const std::string & bundleName,const int32_t userId) const3947 bool BundleDataMgr::HasUserInstallInBundle(
3948     const std::string &bundleName, const int32_t userId) const
3949 {
3950     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
3951     auto infoItem = bundleInfos_.find(bundleName);
3952     if (infoItem == bundleInfos_.end()) {
3953         return false;
3954     }
3955 
3956     return infoItem->second.HasInnerBundleUserInfo(userId);
3957 }
3958 
3959 #ifdef ABILITY_RUNTIME_ENABLE
GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,const std::string & bundleName,const std::vector<int32_t> & cloneAppIndexes) const3960 std::vector<int32_t> BundleDataMgr::GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,
3961     const std::string &bundleName, const std::vector<int32_t> &cloneAppIndexes) const
3962 {
3963     std::vector<int32_t> noRunningCloneAppIndexes;
3964     if (appMgrProxy == nullptr) {
3965         APP_LOGW("fail to find the app mgr service to check app is running");
3966         return noRunningCloneAppIndexes;
3967     }
3968 
3969     for (const auto &appIndex : cloneAppIndexes) {
3970         bool running = SystemAbilityHelper::IsAppRunning(appMgrProxy, bundleName, appIndex);
3971         if (running) {
3972             APP_LOGW("No del cache for %{public}s[%{public}d]: is running", bundleName.c_str(), appIndex);
3973             continue;
3974         }
3975         noRunningCloneAppIndexes.emplace_back(appIndex);
3976     }
3977     return noRunningCloneAppIndexes;
3978 }
3979 #endif
3980 
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) const3981 void BundleDataMgr::GetBundleCacheInfo(
3982     std::function<std::vector<int32_t>(std::string&, std::vector<int32_t>&)> idxFilter,
3983     const InnerBundleInfo &info,
3984     std::vector<std::tuple<std::string, std::vector<std::string>, std::vector<int32_t>>> &validBundles,
3985     const int32_t userId, bool isClean) const
3986 {
3987     std::string bundleName = info.GetBundleName();
3988     if (isClean && !info.GetBaseApplicationInfo().userDataClearable) {
3989         APP_LOGW("Not clearable:%{public}s, userid:%{public}d", bundleName.c_str(), userId);
3990         return;
3991     }
3992     std::vector<std::string> moduleNameList;
3993     info.GetModuleNames(moduleNameList);
3994     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
3995     cloneAppIndexes.emplace_back(0);
3996     std::vector<int32_t> allAppIndexes = cloneAppIndexes;
3997     if (isClean) {
3998         allAppIndexes = idxFilter(bundleName, cloneAppIndexes);
3999     }
4000     validBundles.emplace_back(std::make_tuple(bundleName, moduleNameList, allAppIndexes));
4001     // add atomic service
4002     if (info.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE) {
4003         std::string atomicServiceName;
4004         AccountSA::OhosAccountInfo accountInfo;
4005         auto ret = GetDirForAtomicServiceByUserId(bundleName, userId, accountInfo, atomicServiceName);
4006         if (ret == ERR_OK && !atomicServiceName.empty()) {
4007             APP_LOGD("atomicServiceName: %{public}s", atomicServiceName.c_str());
4008             validBundles.emplace_back(std::make_tuple(atomicServiceName, moduleNameList, allAppIndexes));
4009         }
4010     }
4011 }
4012 
GetBundleCacheInfos(const int32_t userId,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,bool isClean) const4013 void BundleDataMgr::GetBundleCacheInfos(const int32_t userId, std::vector<std::tuple<std::string,
4014     std::vector<std::string>, std::vector<int32_t>>> &validBundles, bool isClean) const
4015 {
4016 #ifdef ABILITY_RUNTIME_ENABLE
4017     sptr<IAppMgr> appMgrProxy = iface_cast<IAppMgr>(SystemAbilityHelper::GetSystemAbility(APP_MGR_SERVICE_ID));
4018     if (appMgrProxy == nullptr) {
4019         APP_LOGE("CleanBundleCache fail to find the app mgr service to check app is running");
4020         return;
4021     }
4022     auto idxFiltor = [&appMgrProxy, this](std::string &bundleName, std::vector<int32_t> &allidx) {
4023         return this->GetNoRunningBundleCloneIndexes(appMgrProxy, bundleName, allidx);
4024     };
4025 #else
4026     auto idxFiltor = [](std::string &bundleName, std::vector<int32_t> &allidx) {
4027         return allidx;
4028     };
4029 #endif
4030     std::map<std::string, InnerBundleInfo> infos = GetAllInnerBundleInfos();
4031     for (const auto &item : infos) {
4032         GetBundleCacheInfo(idxFiltor, item.second, validBundles, userId, isClean);
4033     }
4034     return;
4035 }
4036 
GetBundleStats(const std::string & bundleName,const int32_t userId,std::vector<int64_t> & bundleStats,const int32_t appIndex,const uint32_t statFlag) const4037 bool BundleDataMgr::GetBundleStats(const std::string &bundleName,
4038     const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex, const uint32_t statFlag) const
4039 {
4040     int32_t responseUserId = -1;
4041     int32_t uid = -1;
4042     std::vector<std::string> moduleNameList;
4043     {
4044         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4045         const auto infoItem = bundleInfos_.find(bundleName);
4046         if (infoItem == bundleInfos_.end()) {
4047             return false;
4048         }
4049         responseUserId = infoItem->second.GetResponseUserId(userId);
4050         uid = infoItem->second.GetUid(responseUserId, appIndex);
4051         infoItem->second.GetModuleNames(moduleNameList);
4052     }
4053     ErrCode ret = InstalldClient::GetInstance()->GetBundleStats(
4054         bundleName, responseUserId, bundleStats, uid, appIndex, statFlag, moduleNameList);
4055     if (ret != ERR_OK) {
4056         APP_LOGW("%{public}s getStats failed", bundleName.c_str());
4057         return false;
4058     }
4059     {
4060         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4061         const auto infoItem = bundleInfos_.find(bundleName);
4062         if (infoItem == bundleInfos_.end()) {
4063             return false;
4064         }
4065         if (appIndex == 0 && infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
4066             for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
4067                 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
4068                     continue;
4069                 }
4070                 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
4071             }
4072         }
4073     }
4074 
4075     return true;
4076 }
4077 
BatchGetBundleStats(const std::vector<std::string> & bundleNames,int32_t userId,std::vector<BundleStorageStats> & bundleStats) const4078 ErrCode BundleDataMgr::BatchGetBundleStats(const std::vector<std::string> &bundleNames, int32_t userId,
4079     std::vector<BundleStorageStats> &bundleStats) const
4080 {
4081     int32_t uid = -1;
4082     std::unordered_map<std::string, int32_t> uidMap;
4083     std::vector<std::string> bundleNameList = bundleNames;
4084     std::vector<BundleStorageStats> bundleStatsList;
4085     if (!HasUserId(userId)) {
4086         APP_LOGE("userId %{public}d not exist.", userId);
4087         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4088     }
4089     {
4090         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4091         for (auto bundleName = bundleNameList.begin(); bundleName != bundleNameList.end();) {
4092             const auto infoItem = bundleInfos_.find(*bundleName);
4093             InnerBundleUserInfo userInfo;
4094             if (infoItem == bundleInfos_.end() ||
4095                 !infoItem->second.GetInnerBundleUserInfo(infoItem->second.GetResponseUserId(userId), userInfo)) {
4096                 BundleStorageStats stats;
4097                 stats.bundleName = *bundleName;
4098                 bundleName = bundleNameList.erase(bundleName);
4099                 stats.errCode = ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4100                 bundleStatsList.push_back(stats);
4101                 continue;
4102             }
4103             uidMap.emplace(*bundleName, userInfo.uid);
4104             ++bundleName;
4105         }
4106     }
4107     ErrCode ret = InstalldClient::GetInstance()->BatchGetBundleStats(
4108         bundleNameList, userId, uidMap, bundleStats);
4109     if (ret != ERR_OK) {
4110         APP_LOGE("getStats failed");
4111         return ret;
4112     }
4113     if (!bundleStatsList.empty()) {
4114         bundleStats.insert(bundleStats.end(), bundleStatsList.begin(), bundleStatsList.end());
4115     }
4116     for (const auto &name : bundleNameList) {
4117         GetPreBundleSize(name, bundleStats);
4118     }
4119     return ERR_OK;
4120 }
4121 
GetPreBundleSize(const std::string & name,std::vector<BundleStorageStats> & bundleStats) const4122 void BundleDataMgr::GetPreBundleSize(const std::string &name, std::vector<BundleStorageStats> &bundleStats) const
4123 {
4124     auto statsIter = std::find_if(bundleStats.begin(), bundleStats.end(),
4125         [&name](const BundleStorageStats &stats) { return stats.bundleName == name; });
4126     if (statsIter == bundleStats.end()) {
4127         return;
4128     }
4129     std::string hapPath;
4130     bool getPreBundleSize = false;
4131     {
4132         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4133         const auto infoItem = bundleInfos_.find(name);
4134         if (infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
4135             for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
4136                 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
4137                     continue;
4138                 }
4139                 hapPath = innerModuleInfo.second.hapPath;
4140                 getPreBundleSize = true;
4141             }
4142         }
4143     }
4144     if (getPreBundleSize) {
4145         statsIter->bundleStats[0] += BundleUtil::GetFileSize(hapPath);
4146     }
4147 }
4148 
GetBundleModuleNames(const std::string & bundleName,std::vector<std::string> & moduleNameList) const4149 void BundleDataMgr::GetBundleModuleNames(const std::string &bundleName,
4150     std::vector<std::string> &moduleNameList) const
4151 {
4152     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4153     const auto infoItem = bundleInfos_.find(bundleName);
4154     if (infoItem == bundleInfos_.end()) {
4155         APP_LOGW("No modules of: %{public}s", bundleName.c_str());
4156         return;
4157     }
4158     infoItem->second.GetModuleNames(moduleNameList);
4159 }
4160 
GetAllBundleStats(const int32_t userId,std::vector<int64_t> & bundleStats) const4161 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
4162 {
4163     std::vector<int32_t> uids;
4164     int32_t responseUserId = userId;
4165     int32_t requestUserId = GetUserId(userId);
4166     if (requestUserId == Constants::INVALID_USERID) {
4167         APP_LOGE("invalid userid :%{public}d", userId);
4168         return false;
4169     }
4170     {
4171         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4172         for (const auto &item : bundleInfos_) {
4173             const InnerBundleInfo &info = item.second;
4174             std::string bundleName = info.GetBundleName();
4175             responseUserId = info.GetResponseUserId(requestUserId);
4176             if (responseUserId == Constants::INVALID_USERID) {
4177                 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
4178                 continue;
4179             }
4180             BundleType type = info.GetApplicationBundleType();
4181             if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
4182                 APP_LOGD("BundleType is invalid: %{public}d, bundname: %{public}s", type, bundleName.c_str());
4183                 continue;
4184             }
4185             std::vector<int32_t> allAppIndexes = {0};
4186             if (type == BundleType::APP) {
4187                 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
4188                 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
4189             }
4190             for (int32_t appIndex: allAppIndexes) {
4191                 int32_t uid = info.GetUid(responseUserId, appIndex);
4192                 uids.emplace_back(uid);
4193             }
4194         }
4195     }
4196     if (InstalldClient::GetInstance()->GetAllBundleStats(responseUserId, bundleStats, uids) != ERR_OK) {
4197         APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
4198         return false;
4199     }
4200     if (bundleStats.empty()) {
4201         APP_LOGE("bundle stats is empty");
4202         return true;
4203     }
4204     return true;
4205 }
4206 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string & bundleName) const4207 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
4208 {
4209     return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
4210 }
4211 
GetBundleSpaceSize(const std::string & bundleName,int32_t userId) const4212 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
4213 {
4214     int64_t spaceSize = 0;
4215     if (userId != Constants::ALL_USERID) {
4216         std::vector<int64_t> bundleStats;
4217         if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
4218             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
4219             return spaceSize;
4220         }
4221 
4222         spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
4223         return spaceSize;
4224     }
4225 
4226     for (const auto &iterUserId : GetAllUser()) {
4227         std::vector<int64_t> bundleStats;
4228         if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
4229             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
4230             continue;
4231         }
4232 
4233         auto startIter = bundleStats.begin();
4234         auto endIter = bundleStats.end();
4235         if (spaceSize == 0) {
4236             spaceSize = std::accumulate(startIter, endIter, spaceSize);
4237         } else {
4238             spaceSize = std::accumulate(++startIter, endIter, spaceSize);
4239         }
4240     }
4241 
4242     return spaceSize;
4243 }
4244 
GetAllFreeInstallBundleSpaceSize() const4245 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
4246 {
4247     int64_t allSize = 0;
4248     std::map<std::string, std::vector<std::string>> freeInstallModules;
4249     if (!GetFreeInstallModules(freeInstallModules)) {
4250         APP_LOGW("no removable bundles");
4251         return allSize;
4252     }
4253 
4254     for (const auto &iter : freeInstallModules) {
4255         APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
4256         allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
4257     }
4258 
4259     APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
4260     return allSize;
4261 }
4262 
GetFreeInstallModules(std::map<std::string,std::vector<std::string>> & freeInstallModules) const4263 bool BundleDataMgr::GetFreeInstallModules(
4264     std::map<std::string, std::vector<std::string>> &freeInstallModules) const
4265 {
4266     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4267     if (bundleInfos_.empty()) {
4268         APP_LOGW("bundleInfos_ is data is empty");
4269         return false;
4270     }
4271 
4272     for (const auto &iter : bundleInfos_) {
4273         std::vector<std::string> modules;
4274         if (!iter.second.GetFreeInstallModules(modules)) {
4275             continue;
4276         }
4277 
4278         freeInstallModules.emplace(iter.first, modules);
4279     }
4280 
4281     return !freeInstallModules.empty();
4282 }
4283 #endif
4284 
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames) const4285 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
4286 {
4287     InnerBundleInfo innerBundleInfo;
4288     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4289         APP_LOGD("get innerBundleInfo by uid :%{public}d failed", uid);
4290         return false;
4291     }
4292 
4293     bundleNames.emplace_back(innerBundleInfo.GetBundleName());
4294     return true;
4295 }
4296 
GetNameForUid(const int uid,std::string & name) const4297 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
4298 {
4299     int32_t appIndex = 0;
4300     ErrCode ret = GetBundleNameAndIndex(uid, name, appIndex);
4301     if (ret != ERR_OK) {
4302         LOG_NOFUNC_W(BMS_TAG_COMMON, "uid(%{public}d) invalid", uid);
4303         return ret;
4304     }
4305     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
4306         uid, name.c_str(), appIndex);
4307     return ERR_OK;
4308 }
4309 
GetAppIdentifierAndAppIndex(const uint32_t accessTokenId,std::string & appIdentifier,int32_t & appIndex)4310 ErrCode BundleDataMgr::GetAppIdentifierAndAppIndex(const uint32_t accessTokenId,
4311     std::string &appIdentifier, int32_t &appIndex)
4312 {
4313     Security::AccessToken::HapTokenInfo tokenInfo;
4314     if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(accessTokenId, tokenInfo) != ERR_OK) {
4315         APP_LOGE("accessTokenId %{public}d not exist", accessTokenId);
4316         return ERR_BUNDLE_MANAGER_ACCESS_TOKENID_NOT_EXIST;
4317     }
4318     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4319     const auto infoItem = bundleInfos_.find(tokenInfo.bundleName);
4320     if (infoItem == bundleInfos_.end()) {
4321         APP_LOGE("bundleName %{public}s not exist", tokenInfo.bundleName.c_str());
4322         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4323     }
4324 
4325     const InnerBundleInfo &innerBundleInfo = infoItem->second;
4326     appIdentifier = innerBundleInfo.GetAppIdentifier();
4327     appIndex = tokenInfo.instIndex;
4328     return ERR_OK;
4329 }
4330 
GetInnerBundleInfoWithSandboxByUid(const int uid,InnerBundleInfo & innerBundleInfo) const4331 ErrCode BundleDataMgr::GetInnerBundleInfoWithSandboxByUid(const int uid, InnerBundleInfo &innerBundleInfo) const
4332 {
4333     ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
4334     if (ret != ERR_OK) {
4335         APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed");
4336         if (sandboxAppHelper_ == nullptr) {
4337             APP_LOGW("sandboxAppHelper_ is nullptr");
4338             return ERR_BUNDLE_MANAGER_INVALID_UID;
4339         }
4340         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4341             APP_LOGE("Call GetInnerBundleInfoByUid failed");
4342             return ERR_BUNDLE_MANAGER_INVALID_UID;
4343         }
4344     }
4345     return ERR_OK;
4346 }
4347 
GetBundleGids(const std::string & bundleName,std::vector<int> & gids) const4348 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
4349 {
4350     int32_t requestUserId = GetUserId();
4351     InnerBundleUserInfo innerBundleUserInfo;
4352     if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
4353         APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) ",
4354             requestUserId, bundleName.c_str());
4355         return false;
4356     }
4357 
4358     gids = innerBundleUserInfo.gids;
4359     return true;
4360 }
4361 
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids) const4362 bool BundleDataMgr::GetBundleGidsByUid(
4363     const std::string &bundleName, const int &uid, std::vector<int> &gids) const
4364 {
4365     return true;
4366 }
4367 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos) const4368 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
4369 {
4370     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4371     if (bundleInfos_.empty()) {
4372         APP_LOGW("bundleInfos_ data is empty");
4373         return false;
4374     }
4375 
4376     int32_t requestUserId = GetUserId();
4377     for (const auto &info : bundleInfos_) {
4378         if (info.second.IsDisabled()) {
4379             APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
4380             continue;
4381         }
4382         if (info.second.GetIsKeepAlive()) {
4383             BundleInfo bundleInfo;
4384             int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
4385             info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
4386             if (bundleInfo.name == "") {
4387                 continue;
4388             }
4389             bundleInfos.emplace_back(bundleInfo);
4390         }
4391     }
4392     return !(bundleInfos.empty());
4393 }
4394 
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label) const4395 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
4396     const std::string &abilityName, std::string &label) const
4397 {
4398 #ifdef GLOBAL_RESMGR_ENABLE
4399     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4400     int32_t requestUserId = GetUserId();
4401     if (requestUserId == Constants::INVALID_USERID) {
4402         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4403     }
4404     InnerBundleInfo innerBundleInfo;
4405     ErrCode ret =
4406         GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
4407     if (ret != ERR_OK) {
4408         return ret;
4409     }
4410     AbilityInfo abilityInfo;
4411     ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
4412     if (ret != ERR_OK) {
4413         APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
4414             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
4415         return ret;
4416     }
4417     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4418     bool isEnable = false;
4419     ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
4420     if (ret != ERR_OK) {
4421         return ret;
4422     }
4423     if (!isEnable) {
4424         APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
4425         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
4426     }
4427     if (abilityInfo.labelId == 0) {
4428         label = abilityInfo.label;
4429         return ERR_OK;
4430     }
4431     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
4432         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
4433     if (resourceManager == nullptr) {
4434         APP_LOGW("InitResourceManager failed");
4435         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4436     }
4437     auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
4438     if (state != OHOS::Global::Resource::RState::SUCCESS) {
4439         APP_LOGW("ResourceManager GetStringById failed");
4440         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4441     }
4442     return ERR_OK;
4443 #else
4444     APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
4445     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
4446 #endif
4447 }
4448 
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo,int32_t userId) const4449 bool BundleDataMgr::GetHapModuleInfo(
4450     const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
4451 {
4452     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4453     int32_t requestUserId = GetUserId(userId);
4454     if (requestUserId == Constants::INVALID_USERID) {
4455         return false;
4456     }
4457 
4458     if (bundleInfos_.empty()) {
4459         APP_LOGW("bundleInfos_ data is empty");
4460         return false;
4461     }
4462 
4463     APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
4464     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4465     if (infoItem == bundleInfos_.end()) {
4466         return false;
4467     }
4468 
4469     const InnerBundleInfo &innerBundleInfo = infoItem->second;
4470     if (innerBundleInfo.IsDisabled()) {
4471         APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4472         return false;
4473     }
4474 
4475     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4476     auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
4477     if (!module) {
4478         APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
4479             abilityInfo.bundleName.c_str());
4480         return false;
4481     }
4482     hapModuleInfo = *module;
4483     return true;
4484 }
4485 
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId) const4486 ErrCode BundleDataMgr::GetLaunchWantForBundle(
4487     const std::string &bundleName, Want &want, int32_t userId) const
4488 {
4489     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4490     InnerBundleInfo innerBundleInfo;
4491     ErrCode ret = GetInnerBundleInfoWithFlagsV9(
4492         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
4493     if (ret != ERR_OK) {
4494         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
4495         return ret;
4496     }
4497 
4498     std::string mainAbility = innerBundleInfo.GetMainAbility();
4499     if (mainAbility.empty()) {
4500         APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
4501         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4502     }
4503 
4504     want.SetElementName("", bundleName, mainAbility);
4505     want.SetAction(Constants::ACTION_HOME);
4506     want.AddEntity(Constants::ENTITY_HOME);
4507     return ERR_OK;
4508 }
4509 
CheckIsSystemAppByUid(const int uid) const4510 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
4511 {
4512     // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
4513     // the uid should be the system uid.
4514     if (uid == Constants::ROOT_UID || uid == ServiceConstants::BMS_UID) {
4515         return true;
4516     }
4517 
4518     InnerBundleInfo innerBundleInfo;
4519     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4520         return false;
4521     }
4522 
4523     return innerBundleInfo.IsSystemApp();
4524 }
4525 
InitStateTransferMap()4526 void BundleDataMgr::InitStateTransferMap()
4527 {
4528     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
4529     transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
4530     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
4531     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
4532     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
4533     transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
4534     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
4535     transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
4536     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
4537     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
4538     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
4539     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
4540     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
4541     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
4542     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
4543     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
4544     transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
4545     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
4546     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
4547     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
4548     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
4549     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
4550     transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
4551     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
4552     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
4553     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
4554     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
4555     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
4556 }
4557 
IsDeleteDataState(const InstallState state) const4558 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
4559 {
4560     return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
4561             state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
4562 }
4563 
IsDisableState(const InstallState state) const4564 bool BundleDataMgr::IsDisableState(const InstallState state) const
4565 {
4566     if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
4567         return true;
4568     }
4569     return false;
4570 }
4571 
DeleteBundleInfo(const std::string & bundleName,const InstallState state,const bool isKeepData)4572 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state, const bool isKeepData)
4573 {
4574     if (InstallState::INSTALL_FAIL == state) {
4575         APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
4576         return;
4577     }
4578 
4579     auto infoItem = bundleInfos_.find(bundleName);
4580     if (infoItem == bundleInfos_.end()) {
4581         APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
4582         return;
4583     }
4584 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
4585     // remove external overlay bundle info and connection
4586     RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
4587 #endif
4588     APP_LOGI("del bundle name:%{public}s", bundleName.c_str());
4589     const InnerBundleInfo &innerBundleInfo = infoItem->second;
4590     if (!isKeepData) {
4591         RecycleUidAndGid(innerBundleInfo);
4592     }
4593     bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
4594     if (!ret) {
4595         APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
4596     }
4597     bundleInfos_.erase(bundleName);
4598     std::lock_guard<ffrt::mutex> hspLock(hspBundleNameMutex_);
4599     if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
4600         appServiceHspBundleName_.erase(bundleName);
4601     }
4602     DeleteDesktopShortcutInfo(bundleName);
4603 }
4604 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,int32_t userId,int32_t appIndex) const4605 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4606     const int32_t flags, int32_t userId, int32_t appIndex) const
4607 {
4608     if (bundleName.empty()) {
4609         return false;
4610     }
4611     int32_t requestUserId = GetUserId(userId);
4612     if (requestUserId == Constants::INVALID_USERID) {
4613         return false;
4614     }
4615 
4616     if (bundleInfos_.empty()) {
4617         APP_LOGW("bundleInfos_ data is empty");
4618         return false;
4619     }
4620     APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
4621     auto item = bundleInfos_.find(bundleName);
4622     if (item == bundleInfos_.end()) {
4623         LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4624             bundleName.c_str(), userId, appIndex, flags);
4625         return false;
4626     }
4627     const InnerBundleInfo &innerBundleInfo = item->second;
4628     if (innerBundleInfo.IsDisabled()) {
4629         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4630             bundleName.c_str(), userId, appIndex, flags);
4631         return false;
4632     }
4633 
4634     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4635     if (appIndex == 0) {
4636         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
4637             && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
4638             LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false or not installed -n %{public}s -u %{public}d"
4639                 " -i %{public}d -f %{public}d", bundleName.c_str(), responseUserId, appIndex, flags);
4640             return false;
4641         }
4642     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
4643         bool isEnabled = false;
4644         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4645         if (ret != ERR_OK) {
4646             LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle %{public}s not install in user %{public}d -i %{public}d",
4647                 bundleName.c_str(), responseUserId, appIndex);
4648             return false;
4649         }
4650         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
4651             LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4652                 bundleName.c_str(), responseUserId, appIndex, flags);
4653             return false;
4654         }
4655     } else {
4656         return false;
4657     }
4658     return true;
4659 }
4660 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4661 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4662     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4663 {
4664     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, userId, appIndex);
4665     if (!res) {
4666         return false;
4667     }
4668     auto item = bundleInfos_.find(bundleName);
4669     if (item == bundleInfos_.end()) {
4670         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4671         return false;
4672     }
4673     info = item->second;
4674     return true;
4675 }
4676 
GetInnerBundleInfoWithBundleFlagsAndLock(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const4677 bool BundleDataMgr::GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName,
4678     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
4679 {
4680     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4681     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, info, userId);
4682     if (!res) {
4683         APP_LOGD("GetInnerBundleInfoWithBundleFlagsAndLock: bundleName %{public}s not find", bundleName.c_str());
4684         return res;
4685     }
4686     return true;
4687 }
4688 
GetInnerBundleInfoWithFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4689 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
4690     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4691 {
4692     int32_t requestUserId = GetUserId(userId);
4693     if (requestUserId == Constants::INVALID_USERID) {
4694         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4695     }
4696 
4697     if (bundleInfos_.empty()) {
4698         APP_LOGD("bundleInfos_ data is empty");
4699         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4700     }
4701     APP_LOGD(
4702         "GetInnerBundleInfoWithFlagsV9:bundleName:%{public}s,flags:%{public}d,userId:%{public}d,appIndex:%{public}d",
4703         bundleName.c_str(), flags, userId, appIndex);
4704     auto item = bundleInfos_.find(bundleName);
4705     if (item == bundleInfos_.end()) {
4706         LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4707             bundleName.c_str(), userId, appIndex, flags);
4708         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4709     }
4710     const InnerBundleInfo &innerBundleInfo = item->second;
4711     if (innerBundleInfo.IsDisabled()) {
4712         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4713             bundleName.c_str(), userId, appIndex, flags);
4714         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4715     }
4716 
4717     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4718     bool isEnabled = false;
4719     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4720     if (ret != ERR_OK) {
4721         LOG_NOFUNC_W(BMS_TAG_COMMON, "bundle %{public}s not install in user %{public}d -i %{public}d",
4722             bundleName.c_str(), responseUserId, appIndex);
4723         return ret;
4724     }
4725     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
4726         && !isEnabled) {
4727         LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4728             bundleName.c_str(), responseUserId, appIndex, flags);
4729         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4730     }
4731     info = innerBundleInfo;
4732     return ERR_OK;
4733 }
4734 
GetInnerBundleInfoWithBundleFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4735 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
4736     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4737 {
4738     if (bundleName.empty()) {
4739         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4740     }
4741     int32_t requestUserId = GetUserId(userId);
4742     if (requestUserId == Constants::INVALID_USERID) {
4743         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4744     }
4745 
4746     if (bundleInfos_.empty()) {
4747         APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
4748         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4749     }
4750     APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
4751     auto item = bundleInfos_.find(bundleName);
4752     if (item == bundleInfos_.end()) {
4753         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4754         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4755     }
4756     const InnerBundleInfo &innerBundleInfo = item->second;
4757     if (innerBundleInfo.IsDisabled()) {
4758         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
4759         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4760     }
4761 
4762     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4763     bool isEnabled = false;
4764     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4765     if (ret != ERR_OK) {
4766         return ret;
4767     }
4768     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
4769         && !isEnabled) {
4770         APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4771         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4772     }
4773     info = innerBundleInfo;
4774     return ERR_OK;
4775 }
4776 
GetInnerBundleInfoWithDisable(const std::string & bundleName,InnerBundleInfo & info)4777 bool BundleDataMgr::GetInnerBundleInfoWithDisable(const std::string &bundleName, InnerBundleInfo &info)
4778 {
4779     APP_LOGD("GetInnerBundleInfoWithDisable %{public}s", bundleName.c_str());
4780     if (bundleName.empty()) {
4781         APP_LOGW("bundleName is empty");
4782         return false;
4783     }
4784 
4785     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4786     auto infoItem = bundleInfos_.find(bundleName);
4787     if (infoItem == bundleInfos_.end()) {
4788         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4789         return false;
4790     }
4791     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4792     info = infoItem->second;
4793     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4794     return true;
4795 }
4796 
DisableBundle(const std::string & bundleName)4797 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
4798 {
4799     APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
4800     if (bundleName.empty()) {
4801         APP_LOGW("bundleName empty");
4802         return false;
4803     }
4804 
4805     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4806     auto infoItem = bundleInfos_.find(bundleName);
4807     if (infoItem == bundleInfos_.end()) {
4808         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4809         return false;
4810     }
4811     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4812     return true;
4813 }
4814 
EnableBundle(const std::string & bundleName)4815 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
4816 {
4817     APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
4818     if (bundleName.empty()) {
4819         APP_LOGW("bundleName empty");
4820         return false;
4821     }
4822 
4823     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4824     auto infoItem = bundleInfos_.find(bundleName);
4825     if (infoItem == bundleInfos_.end()) {
4826         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4827         return false;
4828     }
4829     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4830     return true;
4831 }
4832 
IsApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool & isEnabled,int32_t userId) const4833 ErrCode BundleDataMgr::IsApplicationEnabled(
4834     const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const
4835 {
4836     APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
4837     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4838     auto infoItem = bundleInfos_.find(bundleName);
4839     if (infoItem == bundleInfos_.end()) {
4840         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4841         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4842     }
4843     int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId(userId));
4844     if (appIndex == 0) {
4845         ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
4846         if (ret != ERR_OK) {
4847             APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
4848         }
4849         return ret;
4850     }
4851     const InnerBundleInfo &bundleInfo = infoItem->second;
4852     InnerBundleUserInfo innerBundleUserInfo;
4853     if (!bundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
4854         APP_LOGW("can not find userId %{public}d", responseUserId);
4855         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4856     }
4857     auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex));
4858     if (iter == innerBundleUserInfo.cloneInfos.end()) {
4859         APP_LOGW("can not find appIndex %{public}d", appIndex);
4860         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4861     }
4862     isEnabled = iter->second.enabled;
4863     return ERR_OK;
4864 }
4865 
SetApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool isEnable,const std::string & caller,int32_t userId)4866 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName,
4867     int32_t appIndex, bool isEnable, const std::string &caller, int32_t userId)
4868 {
4869     APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
4870     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4871     int32_t requestUserId = GetUserId(userId);
4872     if (requestUserId == Constants::INVALID_USERID) {
4873         APP_LOGW("Request userId %{public}d is invalid, bundleName:%{public}s", userId, bundleName.c_str());
4874         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4875     }
4876     auto infoItem = bundleInfos_.find(bundleName);
4877     if (infoItem == bundleInfos_.end()) {
4878         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4879         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4880     }
4881 
4882     InnerBundleInfo& newInfo = infoItem->second;
4883     if (appIndex != 0) {
4884         auto ret = newInfo.SetCloneApplicationEnabled(isEnable, appIndex, caller, requestUserId);
4885         if (ret != ERR_OK) {
4886             APP_LOGW("SetCloneApplicationEnabled for innerBundleInfo fail, errCode is %{public}d", ret);
4887             return ret;
4888         }
4889         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4890             APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", newInfo.GetBundleName().c_str());
4891             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4892         }
4893         return ERR_OK;
4894     }
4895     auto ret = newInfo.SetApplicationEnabled(isEnable, caller, requestUserId);
4896     if (ret != ERR_OK) {
4897         APP_LOGW("SetApplicationEnabled failed, err %{public}d", ret);
4898         return ret;
4899     }
4900 
4901     InnerBundleUserInfo innerBundleUserInfo;
4902     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4903         APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
4904         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4905     }
4906 
4907     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4908         bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
4909     } else {
4910         bundleStateStorage_->SaveBundleStateStorage(
4911             bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4912     }
4913     return ERR_OK;
4914 }
4915 
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)4916 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
4917 {
4918     if (bundleName.empty() || moduleName.empty()) {
4919         APP_LOGW("bundleName or moduleName is empty");
4920         return false;
4921     }
4922     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4923     if (userId == Constants::INVALID_USERID) {
4924         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4925         return false;
4926     }
4927     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4928         bundleName.c_str(), moduleName.c_str(), userId);
4929     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4930     auto infoItem = bundleInfos_.find(bundleName);
4931     if (infoItem == bundleInfos_.end()) {
4932         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4933         return false;
4934     }
4935     InnerBundleInfo newInfo = infoItem->second;
4936     bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
4937     if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
4938         ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
4939 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
4940         if (isEnable) {
4941             // call clean task
4942             APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
4943                 bundleName.c_str(), isEnable, ret);
4944             DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
4945                 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
4946         }
4947 #endif
4948         return ret;
4949     } else {
4950         APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
4951         return false;
4952     }
4953 }
4954 
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable) const4955 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
4956     bool &isRemovable) const
4957 {
4958     if (bundleName.empty() || moduleName.empty()) {
4959         APP_LOGW("bundleName or moduleName is empty");
4960         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4961     }
4962     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4963     if (userId == Constants::INVALID_USERID) {
4964         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4965         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4966     }
4967     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4968         bundleName.c_str(), moduleName.c_str(), userId);
4969     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4970     auto infoItem = bundleInfos_.find(bundleName);
4971     if (infoItem == bundleInfos_.end()) {
4972         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4973         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4974     }
4975     InnerBundleInfo newInfo = infoItem->second;
4976     return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
4977 }
4978 
IsAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool & isEnable) const4979 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const
4980 {
4981     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
4982     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4983     if (infoItem == bundleInfos_.end()) {
4984         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4985         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4986     }
4987     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(abilityInfo.bundleName, Constants::ALL_USERID);
4988     if ((appIndex != 0) && (std::find(appIndexVec.begin(), appIndexVec.end(), appIndex) == appIndexVec.end())) {
4989         APP_LOGE("appIndex %{public}d is invalid", appIndex);
4990         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4991     }
4992     InnerBundleInfo innerBundleInfo = infoItem->second;
4993     auto ability = innerBundleInfo.FindAbilityInfoV9(
4994         abilityInfo.moduleName, abilityInfo.name);
4995     if (!ability) {
4996         APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
4997             abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
4998         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4999     }
5000     int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
5001     return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable, appIndex);
5002 }
5003 
SetAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool isEnabled,int32_t userId)5004 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex,
5005     bool isEnabled, int32_t userId)
5006 {
5007     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5008     int32_t requestUserId = GetUserId(userId);
5009     if (requestUserId == Constants::INVALID_USERID) {
5010         APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
5011             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5012         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5013     }
5014     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
5015     if (infoItem == bundleInfos_.end()) {
5016         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
5017         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5018     }
5019     InnerBundleInfo& newInfo = infoItem->second;
5020     if (appIndex != 0) {
5021         auto ret = newInfo.SetCloneAbilityEnabled(
5022             abilityInfo.moduleName, abilityInfo.name, isEnabled, userId, appIndex);
5023         if (ret != ERR_OK) {
5024             APP_LOGW("SetCloneAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
5025                 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5026             return ret;
5027         }
5028         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
5029             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", newInfo.GetBundleName().c_str());
5030             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
5031         }
5032         return ERR_OK;
5033     }
5034     ErrCode ret = newInfo.SetAbilityEnabled(
5035         abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
5036     if (ret != ERR_OK) {
5037         APP_LOGW("SetAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
5038             ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5039         return ret;
5040     }
5041     InnerBundleUserInfo innerBundleUserInfo;
5042     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
5043         APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
5044             requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
5045         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5046     }
5047     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
5048         bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
5049     } else {
5050         bundleStateStorage_->SaveBundleStateStorage(
5051             abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
5052     }
5053     return ERR_OK;
5054 }
5055 
GetSandboxAppHelper() const5056 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
5057 {
5058     return sandboxAppHelper_;
5059 }
5060 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)5061 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
5062 {
5063     APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
5064     std::unique_lock<ffrt::shared_mutex> lock(callbackMutex_);
5065     callbackList_.emplace_back(bundleStatusCallback);
5066     if (bundleStatusCallback->AsObject() != nullptr) {
5067         sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
5068             new (std::nothrow) BundleStatusCallbackDeathRecipient();
5069         if (deathRecipient == nullptr) {
5070             APP_LOGW("deathRecipient is null");
5071             return false;
5072         }
5073         bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
5074     }
5075     return true;
5076 }
5077 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)5078 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
5079 {
5080     if (bundleEventCallback == nullptr) {
5081         APP_LOGW("bundleEventCallback is null");
5082         return false;
5083     }
5084     std::lock_guard lock(eventCallbackMutex_);
5085     if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
5086         APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
5087         return false;
5088     }
5089     if (bundleEventCallback->AsObject() != nullptr) {
5090         sptr<BundleEventCallbackDeathRecipient> deathRecipient =
5091             new (std::nothrow) BundleEventCallbackDeathRecipient();
5092         if (deathRecipient == nullptr) {
5093             APP_LOGW("deathRecipient is null");
5094             return false;
5095         }
5096         bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
5097     }
5098     eventCallbackList_.emplace_back(bundleEventCallback);
5099     return true;
5100 }
5101 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)5102 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
5103 {
5104     APP_LOGD("begin to UnregisterBundleEventCallback");
5105     if (bundleEventCallback == nullptr) {
5106         APP_LOGW("bundleEventCallback is null");
5107         return false;
5108     }
5109     std::lock_guard lock(eventCallbackMutex_);
5110     eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
5111         [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
5112             return callback->AsObject() == bundleEventCallback->AsObject();
5113         }), eventCallbackList_.end());
5114     return true;
5115 }
5116 
NotifyBundleEventCallback(const EventFwk::CommonEventData & eventData) const5117 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
5118 {
5119     APP_LOGD("begin to NotifyBundleEventCallback");
5120     std::lock_guard lock(eventCallbackMutex_);
5121     for (const auto &callback : eventCallbackList_) {
5122         callback->OnReceiveEvent(eventData);
5123     }
5124     APP_LOGD("finish to NotifyBundleEventCallback");
5125 }
5126 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)5127 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
5128 {
5129     APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
5130     std::unique_lock<ffrt::shared_mutex> lock(callbackMutex_);
5131     callbackList_.erase(std::remove_if(callbackList_.begin(),
5132         callbackList_.end(),
5133         [&](const sptr<IBundleStatusCallback> &callback) {
5134             return callback->AsObject() == bundleStatusCallback->AsObject();
5135         }),
5136         callbackList_.end());
5137     return true;
5138 }
5139 
UnregisterBundleStatusCallback()5140 bool BundleDataMgr::UnregisterBundleStatusCallback()
5141 {
5142     std::unique_lock<ffrt::shared_mutex> lock(callbackMutex_);
5143     callbackList_.clear();
5144     return true;
5145 }
5146 
GenerateUidAndGid(InnerBundleUserInfo & innerBundleUserInfo)5147 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
5148 {
5149     if (innerBundleUserInfo.bundleName.empty()) {
5150         APP_LOGW("bundleName is null");
5151         return false;
5152     }
5153 
5154     int32_t bundleId = INVALID_BUNDLEID;
5155     if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
5156         APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
5157         return false;
5158     }
5159 
5160     innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
5161         + bundleId % Constants::BASE_USER_RANGE;
5162     innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
5163     return true;
5164 }
5165 
GenerateBundleId(const std::string & bundleName,int32_t & bundleId)5166 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
5167 {
5168     std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5169     if (bundleIdMap_.empty()) {
5170         APP_LOGD("first app install");
5171         bundleId = baseAppUid_;
5172         bundleIdMap_.emplace(bundleId, bundleName);
5173         return true;
5174     }
5175 
5176     for (const auto &innerBundleId : bundleIdMap_) {
5177         if (innerBundleId.second == bundleName) {
5178             bundleId = innerBundleId.first;
5179             return true;
5180         }
5181     }
5182 
5183     for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
5184         if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
5185             APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
5186             bundleId = i;
5187             bundleIdMap_.emplace(bundleId, bundleName);
5188             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5189             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
5190             return true;
5191         }
5192     }
5193 
5194     if (bundleIdMap_.rbegin()->first == MAX_APP_UID) {
5195         APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
5196         return false;
5197     }
5198 
5199     bundleId = bundleIdMap_.rbegin()->first + 1;
5200     bundleIdMap_.emplace(bundleId, bundleName);
5201     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5202     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
5203     return true;
5204 }
5205 
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,const int32_t upgradeFlag)5206 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
5207     const std::string &moduleName, const int32_t upgradeFlag)
5208 {
5209     APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
5210     if (bundleName.empty() || moduleName.empty()) {
5211         APP_LOGW("bundleName or moduleName is empty");
5212         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
5213     }
5214     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5215     auto infoItem = bundleInfos_.find(bundleName);
5216     if (infoItem == bundleInfos_.end()) {
5217         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
5218     }
5219     InnerBundleInfo &newInfo = infoItem->second;
5220     ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
5221     if (setFlag == ERR_OK) {
5222         if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
5223             return ERR_OK;
5224         }
5225         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
5226     }
5227     APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
5228     return setFlag;
5229 }
5230 
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName) const5231 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
5232 {
5233     APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
5234     if (bundleName.empty() || moduleName.empty()) {
5235         APP_LOGW("bundleName or moduleName is empty");
5236         return false;
5237     }
5238     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5239     auto infoItem = bundleInfos_.find(bundleName);
5240     if (infoItem == bundleInfos_.end()) {
5241         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5242         return false;
5243     }
5244     InnerBundleInfo newInfo = infoItem->second;
5245     return newInfo.GetModuleUpgradeFlag(moduleName);
5246 }
5247 
RecycleUidAndGid(const InnerBundleInfo & info)5248 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
5249 {
5250     auto userInfos = info.GetInnerBundleUserInfos();
5251     if (userInfos.empty()) {
5252         APP_LOGE("user infos is empty");
5253         return;
5254     }
5255 
5256     auto innerBundleUserInfo = userInfos.begin()->second;
5257     int32_t bundleId = innerBundleUserInfo.uid -
5258         innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5259     std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5260     auto infoItem = bundleIdMap_.find(bundleId);
5261     if (infoItem == bundleIdMap_.end()) {
5262         return;
5263     }
5264 
5265     UninstallBundleInfo uninstallBundleInfo;
5266     if (GetUninstallBundleInfo(info.GetBundleName(), uninstallBundleInfo)) {
5267         return;
5268     }
5269     bundleIdMap_.erase(bundleId);
5270     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH);
5271     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::SHAREFS_CONFIG_PATH);
5272 }
5273 
RestoreUidAndGid()5274 bool BundleDataMgr::RestoreUidAndGid()
5275 {
5276     for (const auto &info : bundleInfos_) {
5277         bool onlyInsertOne = false;
5278         for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
5279             auto innerBundleUserInfo = infoItem.second;
5280             AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
5281             if (!onlyInsertOne) {
5282                 onlyInsertOne = true;
5283                 int32_t bundleId = innerBundleUserInfo.uid -
5284                     innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5285                 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5286                 auto item = bundleIdMap_.find(bundleId);
5287                 if (item == bundleIdMap_.end()) {
5288                     bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
5289                 } else {
5290                     bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
5291                 }
5292                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5293                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId,
5294                     ServiceConstants::SHAREFS_CONFIG_PATH);
5295                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH,
5296                     info.second.GetAppProvisionType(), Constants::APP_PROVISION_TYPE_FILE_NAME);
5297             }
5298             // appClone
5299             std::string bundleName = info.second.GetBundleName();
5300             std::map<std::string, InnerBundleCloneInfo> &clones = innerBundleUserInfo.cloneInfos;
5301             for (auto iter = clones.begin(); iter != clones.end(); iter++) {
5302                 auto &cloneInfo = iter->second;
5303                 int32_t bundleId = cloneInfo.uid - cloneInfo.userId * Constants::BASE_USER_RANGE;
5304                 std::string cloneBundleName =
5305                     BundleCloneCommonHelper::GetCloneBundleIdKey(bundleName, cloneInfo.appIndex);
5306                 std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5307                 auto item = bundleIdMap_.find(bundleId);
5308                 if (item == bundleIdMap_.end()) {
5309                     bundleIdMap_.emplace(bundleId, cloneBundleName);
5310                 } else {
5311                     bundleIdMap_[bundleId] = cloneBundleName;
5312                 }
5313                 BundleUtil::MakeFsConfig(cloneBundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5314                 BundleUtil::MakeFsConfig(cloneBundleName, bundleId,
5315                     ServiceConstants::SHAREFS_CONFIG_PATH);
5316                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH,
5317                     info.second.GetAppProvisionType(), Constants::APP_PROVISION_TYPE_FILE_NAME);
5318             }
5319         }
5320     }
5321     RestoreUidAndGidFromUninstallInfo();
5322     return true;
5323 }
5324 
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)5325 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
5326 {
5327     if (sandboxAppHelper_ != nullptr) {
5328         std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
5329         sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
5330     }
5331 }
5332 
GetBundleMutex(const std::string & bundleName)5333 ffrt::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
5334 {
5335     bundleMutex_.lock_shared();
5336     auto it = bundleMutexMap_.find(bundleName);
5337     if (it == bundleMutexMap_.end()) {
5338         bundleMutex_.unlock_shared();
5339         std::unique_lock lock {bundleMutex_};
5340         return bundleMutexMap_[bundleName];
5341     }
5342     bundleMutex_.unlock_shared();
5343     return it->second;
5344 }
5345 
GetProvisionId(const std::string & bundleName,std::string & provisionId) const5346 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
5347 {
5348     APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
5349     if (bundleName.empty()) {
5350         APP_LOGW("bundleName empty");
5351         return false;
5352     }
5353     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5354     auto infoItem = bundleInfos_.find(bundleName);
5355     if (infoItem == bundleInfos_.end()) {
5356         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5357         return false;
5358     }
5359     provisionId = infoItem->second.GetProvisionId();
5360     return true;
5361 }
5362 
GetAppFeature(const std::string & bundleName,std::string & appFeature) const5363 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
5364 {
5365     APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
5366     if (bundleName.empty()) {
5367         APP_LOGW("bundleName empty");
5368         return false;
5369     }
5370     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5371     auto infoItem = bundleInfos_.find(bundleName);
5372     if (infoItem == bundleInfos_.end()) {
5373         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5374         return false;
5375     }
5376     appFeature = infoItem->second.GetAppFeature();
5377     return true;
5378 }
5379 
SetInitialUserFlag(bool flag)5380 void BundleDataMgr::SetInitialUserFlag(bool flag)
5381 {
5382     APP_LOGD("SetInitialUserFlag %{public}d", flag);
5383     if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
5384         bundlePromise_->NotifyAllTasksExecuteFinished();
5385     }
5386 
5387     initialUserFlag_ = flag;
5388 }
5389 
GetDataStorage() const5390 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
5391 {
5392     return dataStorage_;
5393 }
5394 
GetAllFormsInfo(std::vector<FormInfo> & formInfos) const5395 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
5396 {
5397     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5398     if (bundleInfos_.empty()) {
5399         APP_LOGW("bundleInfos_ data is empty");
5400         return false;
5401     }
5402     auto result = false;
5403     for (const auto &item : bundleInfos_) {
5404         if (item.second.IsDisabled()) {
5405             APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
5406             continue;
5407         }
5408         item.second.GetFormsInfoByApp(formInfos);
5409         result = true;
5410     }
5411     APP_LOGD("all the form infos find success");
5412     return result;
5413 }
5414 
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos) const5415 bool BundleDataMgr::GetFormsInfoByModule(
5416     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
5417 {
5418     if (bundleName.empty()) {
5419         APP_LOGW("bundle name is empty");
5420         return false;
5421     }
5422     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5423     if (bundleInfos_.empty()) {
5424         APP_LOGW("bundleInfos_ data is empty");
5425         return false;
5426     }
5427     auto infoItem = bundleInfos_.find(bundleName);
5428     if (infoItem == bundleInfos_.end()) {
5429         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5430         return false;
5431     }
5432     if (infoItem->second.IsDisabled()) {
5433         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5434         return false;
5435     }
5436     infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
5437     if (formInfos.empty()) {
5438         return false;
5439     }
5440     APP_LOGD("module forminfo find success");
5441     return true;
5442 }
5443 
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos) const5444 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
5445 {
5446     if (bundleName.empty()) {
5447         APP_LOGW("bundle name is empty");
5448         return false;
5449     }
5450     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5451     if (bundleInfos_.empty()) {
5452         APP_LOGW("bundleInfos_ data is empty");
5453         return false;
5454     }
5455     auto infoItem = bundleInfos_.find(bundleName);
5456     if (infoItem == bundleInfos_.end()) {
5457         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5458         return false;
5459     }
5460     if (infoItem->second.IsDisabled()) {
5461         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5462         return false;
5463     }
5464     infoItem->second.GetFormsInfoByApp(formInfos);
5465     APP_LOGD("App forminfo find success");
5466     return true;
5467 }
5468 
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5469 bool BundleDataMgr::GetShortcutInfos(
5470     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5471 {
5472     int32_t requestUserId = GetUserId(userId);
5473     if (requestUserId == Constants::INVALID_USERID) {
5474         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5475         return false;
5476     }
5477 
5478     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5479     InnerBundleInfo innerBundleInfo;
5480     if (!GetInnerBundleInfoWithFlags(
5481         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
5482         APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
5483             bundleName.c_str(), requestUserId);
5484         return false;
5485     }
5486     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5487 
5488     // get shortcut visible status
5489     for (auto &info : shortcutInfos) {
5490         shortcutVisibleStorage_->GetShortcutVisibleStatus(requestUserId, Constants::MAIN_APP_INDEX, info);
5491     }
5492     return true;
5493 }
5494 
TryGetRawDataByExtractor(const std::string & hapPath,const std::string & profileName,const AbilityInfo & abilityInfo) const5495 std::string BundleDataMgr::TryGetRawDataByExtractor(const std::string &hapPath, const std::string &profileName,
5496     const AbilityInfo &abilityInfo) const
5497 {
5498     std::string rawData;
5499     GetJsonProfileByExtractor(hapPath, profileName, rawData);
5500     if (rawData.empty()) { // if get failed ,try get from resmgr
5501         BundleMgrClient bundleMgrClient;
5502         std::vector<std::string> rawJson;
5503         if (!bundleMgrClient.GetResConfigFile(abilityInfo, META_DATA_SHORTCUTS_NAME, rawJson)) {
5504             APP_LOGD("GetResConfigFile return false");
5505             return "";
5506         }
5507         return rawJson.empty() ? "" : rawJson[0];
5508     }
5509     return rawData;
5510 }
5511 
GetShortcutInfosByInnerBundleInfo(const InnerBundleInfo & info,std::vector<ShortcutInfo> & shortcutInfos) const5512 bool BundleDataMgr::GetShortcutInfosByInnerBundleInfo(
5513     const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const
5514 {
5515     if (!info.GetIsNewVersion()) {
5516         info.GetShortcutInfos(shortcutInfos);
5517         return true;
5518     }
5519     AbilityInfo abilityInfo;
5520     info.GetMainAbilityInfo(abilityInfo);
5521     if (abilityInfo.hapPath.empty() || abilityInfo.metadata.size() <= 0) {
5522         return false;
5523     }
5524     std::string rawData;
5525     for (const auto &meta : abilityInfo.metadata) {
5526         if (meta.name.compare(META_DATA_SHORTCUTS_NAME) == 0) {
5527             std::string resName = meta.resource;
5528             std::string hapPath = abilityInfo.hapPath;
5529             size_t pos = resName.rfind(PROFILE_PREFIX);
5530             bool posValid = (pos != std::string::npos) && (pos != resName.length() - strlen(PROFILE_PREFIX));
5531             if (!posValid) {
5532                 APP_LOGE("resName invalid %{public}s", resName.c_str());
5533                 return false;
5534             }
5535             std::string profileName = PROFILE_PATH + resName.substr(pos + strlen(PROFILE_PREFIX)) + JSON_SUFFIX;
5536             rawData = TryGetRawDataByExtractor(hapPath, profileName, abilityInfo);
5537             break;
5538         }
5539     }
5540     if (rawData.empty()) {
5541         APP_LOGE("shortcutinfo is empty");
5542         return false;
5543     }
5544     nlohmann::json jsonObject = nlohmann::json::parse(rawData, nullptr, false);
5545     if (jsonObject.is_discarded()) {
5546         APP_LOGE("shortcuts json invalid");
5547         return false;
5548     }
5549     ShortcutJson shortcutJson = jsonObject.get<ShortcutJson>();
5550     for (const Shortcut &item : shortcutJson.shortcuts) {
5551         ShortcutInfo shortcutInfo;
5552         shortcutInfo.bundleName = abilityInfo.bundleName;
5553         shortcutInfo.moduleName = abilityInfo.moduleName;
5554         info.InnerProcessShortcut(item, shortcutInfo);
5555         shortcutInfo.sourceType = 1;
5556         APP_LOGI_NOFUNC("shortcutInfo: -n %{public}s, id %{public}s, iconId %{public}d, labelId %{public}d",
5557             shortcutInfo.bundleName.c_str(), shortcutInfo.id.c_str(), shortcutInfo.iconId, shortcutInfo.labelId);
5558         shortcutInfos.emplace_back(shortcutInfo);
5559     }
5560     (void)InnerProcessShortcutId(info.GetBundleUpdateTime(Constants::ALL_USERID), abilityInfo.hapPath, shortcutInfos);
5561     return true;
5562 }
5563 
5564 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & hapPath) const5565 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(const std::string &hapPath) const
5566 {
5567     if (hapPath.empty()) {
5568         APP_LOGE("hapPath is empty");
5569         return nullptr;
5570     }
5571     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
5572     if (resourceManager == nullptr) {
5573         APP_LOGE("InitResMgr failed, -h:%{public}s", hapPath.c_str());
5574         return nullptr;
5575     }
5576 
5577     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
5578     if (!resConfig) {
5579         APP_LOGE("resConfig is nullptr");
5580         return nullptr;
5581     }
5582     resourceManager->UpdateResConfig(*resConfig);
5583     if (!resourceManager->AddResource(hapPath.c_str(), Global::Resource::SELECT_STRING)) {
5584         APP_LOGW("AddResource failed");
5585     }
5586     return resourceManager;
5587 }
5588 #endif
5589 
CheckUpdateTimeWithBmsParam(const int64_t updateTime) const5590 bool BundleDataMgr::CheckUpdateTimeWithBmsParam(const int64_t updateTime) const
5591 {
5592     auto bmsPara = DelayedSingleton<BundleMgrService>::GetInstance()->GetBmsParam();
5593     if (bmsPara == nullptr) {
5594         LOG_E(BMS_TAG_DEFAULT, "bmsPara is nullptr");
5595         return false;
5596     }
5597     std::string val;
5598     if (!bmsPara->GetBmsParam(ServiceConstants::BMS_SYSTEM_TIME_FOR_SHORTCUT, val)) {
5599         LOG_E(BMS_TAG_DEFAULT, "GetBmsParam BMS_SYSTEM_TIME_FOR_SHORTCUT failed");
5600         return false;
5601     }
5602     if (std::to_string(updateTime) < val) {
5603         LOG_W(BMS_TAG_DEFAULT, "updateTime is less than val");
5604         return false;
5605     }
5606     return true;
5607 }
5608 
InnerProcessShortcutId(const int64_t updateTime,const std::string & hapPath,std::vector<ShortcutInfo> & shortcutInfos) const5609 bool BundleDataMgr::InnerProcessShortcutId(const int64_t updateTime,
5610     const std::string &hapPath, std::vector<ShortcutInfo> &shortcutInfos) const
5611 {
5612 #ifdef GLOBAL_RESMGR_ENABLE
5613     bool needToParseShortcutId = false;
5614     for (const auto &info : shortcutInfos) {
5615         if (info.id.find(RESOURCE_STRING_PREFIX) == 0) {
5616             needToParseShortcutId = true;
5617             break;
5618         }
5619     }
5620     if (!needToParseShortcutId) {
5621         return false;
5622     }
5623 
5624     if (!CheckUpdateTimeWithBmsParam(updateTime)) {
5625         return false;
5626     }
5627 
5628     APP_LOGI("shortcut id conatins $string: need parse");
5629     auto resourceManager = GetResourceManager(hapPath);
5630     if (resourceManager == nullptr) {
5631         APP_LOGI("create resource mgr failed");
5632         return false;
5633     }
5634 
5635     for (auto &info : shortcutInfos) {
5636         if (info.id.find(RESOURCE_STRING_PREFIX) != 0) {
5637             continue;
5638         }
5639         uint32_t id = static_cast<uint32_t>(atoi(info.id.substr(std::string(RESOURCE_STRING_PREFIX).size()).c_str()));
5640         std::string shortcutId;
5641         OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(id, shortcutId);
5642         if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
5643             APP_LOGE("GetStringById failed, id:%{public}d", id);
5644             continue;
5645         }
5646         info.id = shortcutId;
5647     }
5648     return true;
5649 
5650 #else
5651     return true;
5652 #endif
5653 }
5654 
GetShortcutInfoV9(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5655 ErrCode BundleDataMgr::GetShortcutInfoV9(
5656     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5657 {
5658     int32_t requestUserId = GetUserId(userId);
5659     if (requestUserId == Constants::INVALID_USERID) {
5660         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5661         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5662     }
5663     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5664     InnerBundleInfo innerBundleInfo;
5665     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
5666         BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
5667     if (ret != ERR_OK) {
5668         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5669             bundleName.c_str(), requestUserId);
5670         return ret;
5671     }
5672 
5673     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5674     // get shortcut visible status
5675     for (auto &info : shortcutInfos) {
5676         shortcutVisibleStorage_->GetShortcutVisibleStatus(requestUserId, Constants::MAIN_APP_INDEX, info);
5677     }
5678     return ERR_OK;
5679 }
5680 
GetShortcutInfoByAppIndex(const std::string & bundleName,const int32_t appIndex,std::vector<ShortcutInfo> & shortcutInfos) const5681 ErrCode BundleDataMgr::GetShortcutInfoByAppIndex(const std::string &bundleName, const int32_t appIndex,
5682     std::vector<ShortcutInfo> &shortcutInfos) const
5683 {
5684     if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
5685         APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
5686         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
5687     }
5688     int32_t requestUserId = GetUserId();
5689     if (requestUserId == Constants::INVALID_USERID) {
5690         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), requestUserId);
5691         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5692     }
5693     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5694     InnerBundleInfo innerBundleInfo;
5695     int32_t flag = static_cast<int32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE);
5696     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flag, innerBundleInfo, requestUserId, appIndex);
5697     if (ret != ERR_OK) {
5698         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5699             bundleName.c_str(), requestUserId);
5700         return ret;
5701     }
5702 
5703     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5704     for (auto &info : shortcutInfos) {
5705         shortcutVisibleStorage_->GetShortcutVisibleStatus(requestUserId, appIndex, info);
5706         info.appIndex = appIndex;
5707     }
5708     return ERR_OK;
5709 }
5710 
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos) const5711 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
5712     std::vector<CommonEventInfo> &commonEventInfos) const
5713 {
5714     if (eventKey.empty()) {
5715         APP_LOGW("event key is empty");
5716         return false;
5717     }
5718     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5719     if (bundleInfos_.empty()) {
5720         APP_LOGW("bundleInfos_ data is empty");
5721         return false;
5722     }
5723     for (const auto &item : bundleInfos_) {
5724         const InnerBundleInfo &info = item.second;
5725         if (info.IsDisabled()) {
5726             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
5727             continue;
5728         }
5729         info.GetCommonEvents(eventKey, commonEventInfos);
5730     }
5731     if (commonEventInfos.size() == 0) {
5732         APP_LOGW("commonEventInfos is empty");
5733         return false;
5734     }
5735     APP_LOGE("commonEventInfos find success");
5736     return true;
5737 }
5738 
SavePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5739 bool BundleDataMgr::SavePreInstallBundleInfo(
5740     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5741 {
5742     if (preInstallDataStorage_ == nullptr) {
5743         APP_LOGW("preInstallDataStorage_ is nullptr");
5744         return false;
5745     }
5746 
5747     if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5748         APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
5749         return true;
5750     }
5751 
5752     return false;
5753 }
5754 
DeletePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5755 bool BundleDataMgr::DeletePreInstallBundleInfo(
5756     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5757 {
5758     if (preInstallDataStorage_ == nullptr) {
5759         APP_LOGW("preInstallDataStorage_ is nullptr");
5760         return false;
5761     }
5762 
5763     if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5764         APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
5765         return true;
5766     }
5767 
5768     return false;
5769 }
5770 
GetPreInstallBundleInfo(const std::string & bundleName,PreInstallBundleInfo & preInstallBundleInfo)5771 bool BundleDataMgr::GetPreInstallBundleInfo(
5772     const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
5773 {
5774     if (bundleName.empty()) {
5775         APP_LOGW("bundleName is empty");
5776         return false;
5777     }
5778     if (preInstallDataStorage_ == nullptr) {
5779         return false;
5780     }
5781     if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
5782         APP_LOGW_NOFUNC("get preInstall bundleInfo failed -n: %{public}s", bundleName.c_str());
5783         return false;
5784     }
5785     return true;
5786 }
5787 
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> & preInstallBundleInfos)5788 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
5789 {
5790     if (preInstallDataStorage_ == nullptr) {
5791         APP_LOGW("preInstallDataStorage_ is nullptr");
5792         return false;
5793     }
5794 
5795     if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
5796         APP_LOGD("load all storage success");
5797         return true;
5798     }
5799 
5800     return false;
5801 }
5802 
SaveInnerBundleInfo(const InnerBundleInfo & info) const5803 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
5804 {
5805     APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
5806     if (dataStorage_->SaveStorageBundleInfo(info)) {
5807         APP_LOGD("save install InnerBundleInfo successfully");
5808         return true;
5809     }
5810     APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
5811     return false;
5812 }
5813 
GetInnerBundleUserInfoByUserId(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo) const5814 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
5815     int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
5816 {
5817     APP_LOGD("get user info start: bundleName: (%{public}s)  userId: (%{public}d) ",
5818         bundleName.c_str(), userId);
5819     int32_t requestUserId = GetUserId(userId);
5820     if (requestUserId == Constants::INVALID_USERID) {
5821         return false;
5822     }
5823 
5824     if (bundleName.empty()) {
5825         APP_LOGW("bundle name is empty");
5826         return false;
5827     }
5828 
5829     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5830     if (bundleInfos_.empty()) {
5831         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5832         return false;
5833     }
5834 
5835     auto infoItem = bundleInfos_.find(bundleName);
5836     if (infoItem == bundleInfos_.end()) {
5837         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5838         return false;
5839     }
5840 
5841     return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
5842 }
5843 
GetUserId(int32_t userId) const5844 int32_t BundleDataMgr::GetUserId(int32_t userId) const
5845 {
5846     if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
5847         return userId;
5848     }
5849 
5850     if (userId == Constants::UNSPECIFIED_USERID) {
5851         userId = GetUserIdByCallingUid();
5852     }
5853 
5854     if (!HasUserId(userId)) {
5855         APP_LOGD("user is not existed");
5856         userId = Constants::INVALID_USERID;
5857     }
5858 
5859     return userId;
5860 }
5861 
GetUserIdByUid(int32_t uid) const5862 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
5863 {
5864     return BundleUtil::GetUserIdByUid(uid);
5865 }
5866 
AddUserId(int32_t userId)5867 void BundleDataMgr::AddUserId(int32_t userId)
5868 {
5869     std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5870     auto item = multiUserIdsSet_.find(userId);
5871     if (item != multiUserIdsSet_.end()) {
5872         return;
5873     }
5874 
5875     multiUserIdsSet_.insert(userId);
5876 }
5877 
RemoveUserId(int32_t userId)5878 void BundleDataMgr::RemoveUserId(int32_t userId)
5879 {
5880     std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5881     auto item = multiUserIdsSet_.find(userId);
5882     if (item == multiUserIdsSet_.end()) {
5883         return;
5884     }
5885 
5886     multiUserIdsSet_.erase(item);
5887 }
5888 
HasUserId(int32_t userId) const5889 bool BundleDataMgr::HasUserId(int32_t userId) const
5890 {
5891     std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5892     return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
5893 }
5894 
GetUserIdByCallingUid() const5895 int32_t BundleDataMgr::GetUserIdByCallingUid() const
5896 {
5897     return BundleUtil::GetUserIdByCallingUid();
5898 }
5899 
GetAllUser() const5900 std::set<int32_t> BundleDataMgr::GetAllUser() const
5901 {
5902     std::lock_guard<ffrt::mutex> lock(multiUserIdSetMutex_);
5903     return multiUserIdsSet_;
5904 }
5905 
CreateAppInstallDir(int32_t userId)5906 void BundleDataMgr::CreateAppInstallDir(int32_t userId)
5907 {
5908     std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5909         ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5910     ErrCode ret = InstalldClient::GetInstance()->Mkdir(path,
5911         S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5912         Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5913     if (ret != ERR_OK) {
5914         APP_LOGE("create app install %{public}d failed", userId);
5915         return;
5916     }
5917 
5918     std::string appClonePath = path + ServiceConstants::GALLERY_CLONE_PATH;
5919     ret = InstalldClient::GetInstance()->Mkdir(appClonePath,
5920         S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5921         Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5922     if (ret != ERR_OK) {
5923         APP_LOGE("create app clone %{public}d failed", userId);
5924     }
5925 }
5926 
RemoveAppInstallDir(int32_t userId)5927 void BundleDataMgr::RemoveAppInstallDir(int32_t userId)
5928 {
5929     std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5930         ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5931     ErrCode ret = InstalldClient::GetInstance()->RemoveDir(path);
5932     if (ret != ERR_OK) {
5933         APP_LOGE("remove app install %{public}d failed", userId);
5934     }
5935 }
5936 
GetInnerBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos) const5937 bool BundleDataMgr::GetInnerBundleUserInfos(
5938     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
5939 {
5940     APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
5941     if (bundleName.empty()) {
5942         APP_LOGW("bundle name is empty");
5943         return false;
5944     }
5945 
5946     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5947     if (bundleInfos_.empty()) {
5948         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5949         return false;
5950     }
5951 
5952     auto infoItem = bundleInfos_.find(bundleName);
5953     if (infoItem == bundleInfos_.end()) {
5954         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
5955         return false;
5956     }
5957 
5958     for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
5959         innerBundleUserInfos.emplace_back(userInfo.second);
5960     }
5961 
5962     return !innerBundleUserInfos.empty();
5963 }
5964 
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)5965 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
5966 {
5967     APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5968     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
5969     InnerBundleInfo info;
5970     if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
5971         return Constants::EMPTY_STRING;
5972     }
5973 
5974     return info.GetAppPrivilegeLevel();
5975 }
5976 
QueryExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5977 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
5978     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5979 {
5980     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
5981     int32_t requestUserId = GetUserId(userId);
5982     if (requestUserId == Constants::INVALID_USERID) {
5983         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5984         return false;
5985     }
5986 
5987     ElementName element = want.GetElement();
5988     std::string bundleName = element.GetBundleName();
5989     std::string extensionName = element.GetAbilityName();
5990     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s extensionName:%{public}s",
5991         bundleName.c_str(), extensionName.c_str());
5992     // explicit query
5993     if (!bundleName.empty() && !extensionName.empty()) {
5994         ExtensionAbilityInfo info;
5995         if (ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex)) {
5996             extensionInfos.emplace_back(info);
5997         }
5998         LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryExtension size:%{public}zu -n %{public}s -e %{public}s -u %{public}d"
5999             " -i %{public}d", extensionInfos.size(), bundleName.c_str(), extensionName.c_str(), userId, appIndex);
6000         return !extensionInfos.empty();
6001     }
6002 
6003     bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
6004     if (!ret) {
6005         LOG_D(BMS_TAG_QUERY,
6006             "implicit queryExtension error action:%{public}s uri:%{private}s type:%{public}s"
6007             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
6008             requestUserId);
6009         return false;
6010     }
6011     if (extensionInfos.size() == 0) {
6012         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
6013             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
6014             requestUserId);
6015         return false;
6016     }
6017     LOG_D(BMS_TAG_QUERY, "query extensionAbilityInfo successfully");
6018     return true;
6019 }
6020 
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6021 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
6022     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6023 {
6024     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6025     int32_t requestUserId = GetUserId(userId);
6026     if (requestUserId == Constants::INVALID_USERID) {
6027         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6028     }
6029 
6030     ElementName element = want.GetElement();
6031     std::string bundleName = element.GetBundleName();
6032     std::string extensionName = element.GetAbilityName();
6033     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
6034         bundleName.c_str(), extensionName.c_str());
6035     // explicit query
6036     if (!bundleName.empty() && !extensionName.empty()) {
6037         ExtensionAbilityInfo info;
6038         ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
6039         if (ret == ERR_OK) {
6040             extensionInfos.emplace_back(info);
6041         }
6042         LOG_NOFUNC_I(BMS_TAG_QUERY, "ExplicitQueryExtension V9 size:%{public}zu -n %{public}s -e %{public}s"
6043             " -u %{public}d -i %{public}d", extensionInfos.size(), bundleName.c_str(), extensionName.c_str(),
6044             userId, appIndex);
6045         return ret;
6046     }
6047     ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6048     if (ret != ERR_OK) {
6049         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionInfosV9 error");
6050         return ret;
6051     }
6052     if (extensionInfos.empty()) {
6053         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
6054             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
6055             requestUserId);
6056         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6057     }
6058     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 success");
6059     return ERR_OK;
6060 }
6061 
QueryExtensionAbilityInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6062 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
6063     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6064 {
6065     int32_t requestUserId = GetUserId(userId);
6066     if (requestUserId == Constants::INVALID_USERID) {
6067         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
6068         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6069     }
6070 
6071     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6072     ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
6073     if (ret != ERR_OK) {
6074         LOG_D(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
6075         return ret;
6076     }
6077     if (extensionInfos.empty()) {
6078         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
6079         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6080     }
6081     LOG_D(BMS_TAG_QUERY, "success");
6082     return ERR_OK;
6083 }
6084 
QueryExtensionAbilityInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6085 ErrCode BundleDataMgr::QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName,
6086     uint32_t flags, int32_t userId,
6087     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6088 {
6089     LOG_I(BMS_TAG_QUERY, "query failed %{public}s %{public}d", typeName.c_str(), userId);
6090     int32_t requestUserId = GetUserId(userId);
6091     if (requestUserId == Constants::INVALID_USERID) {
6092         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6093     }
6094     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6095     ErrCode ret = ImplicitQueryAllExtensionInfos(
6096         flags, requestUserId, extensionInfos, appIndex, typeName);
6097     if (ret != ERR_OK) {
6098         LOG_W(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
6099         return ret;
6100     }
6101     if (extensionInfos.empty()) {
6102         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
6103         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6104     }
6105     LOG_D(BMS_TAG_QUERY, "success");
6106     return ERR_OK;
6107 }
6108 
GetOneExtensionInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6109 void BundleDataMgr::GetOneExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId,
6110     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6111 {
6112     auto innerExtensionInfos = info.GetInnerExtensionInfos();
6113     for (const auto &item : innerExtensionInfos) {
6114         if (typeName != item.second.extensionTypeName) {
6115             continue;
6116         }
6117         infos.emplace_back(InnerExtensionInfo::ConvertToExtensionInfo(item.second));
6118         return;
6119     }
6120 }
6121 
ExplicitQueryExtensionInfo(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const6122 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
6123     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
6124 {
6125     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6126     ElementName element = want.GetElement();
6127     std::string bundleName = element.GetBundleName();
6128     std::string moduleName = element.GetModuleName();
6129     std::string extensionName = element.GetAbilityName();
6130     int32_t requestUserId = GetUserId(userId);
6131     if (requestUserId == Constants::INVALID_USERID) {
6132         return false;
6133     }
6134     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6135     InnerBundleInfo innerBundleInfo;
6136     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
6137         LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
6138         return false;
6139     }
6140     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6141         if (sandboxAppHelper_ == nullptr) {
6142             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6143             return false;
6144         }
6145         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
6146         if (ret != ERR_OK) {
6147             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6148             return false;
6149         }
6150     }
6151     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6152         bool res = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
6153         if (!res) {
6154             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
6155             return false;
6156         }
6157     }
6158     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
6159     if (!extension) {
6160         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
6161         return false;
6162     }
6163     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
6164         extension->permissions.clear();
6165     }
6166     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
6167         extension->metadata.clear();
6168     }
6169     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
6170         extension->skills.clear();
6171     }
6172     extensionInfo = (*extension);
6173     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
6174         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6175         innerBundleInfo.GetApplicationInfo(ApplicationFlag::GET_BASIC_APPLICATION_INFO |
6176             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6177             extensionInfo.applicationInfo, appIndex);
6178     }
6179     // set uid for NAPI cache use
6180     InnerBundleUserInfo innerBundleUserInfo;
6181     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
6182         extensionInfo.uid = innerBundleUserInfo.uid;
6183         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6184             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
6185             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
6186                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
6187                 extensionInfo.uid = cloneInfo.uid;
6188             }
6189         }
6190     }
6191     extensionInfo.appIndex = appIndex;
6192     return true;
6193 }
6194 
ExplicitQueryExtensionInfoV9(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const6195 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
6196     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
6197 {
6198     ElementName element = want.GetElement();
6199     std::string bundleName = element.GetBundleName();
6200     std::string moduleName = element.GetModuleName();
6201     std::string extensionName = element.GetAbilityName();
6202     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
6203         bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
6204     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d, appIndex:%{public}d",
6205         flags, userId, appIndex);
6206     int32_t requestUserId = GetUserId(userId);
6207     if (requestUserId == Constants::INVALID_USERID) {
6208         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6209     }
6210     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6211     InnerBundleInfo innerBundleInfo;
6212     if (appIndex == 0) {
6213         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
6214         if (ret != ERR_OK) {
6215             LOG_D(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
6216             return ret;
6217         }
6218     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6219         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
6220         if (ret != ERR_OK) {
6221             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
6222             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6223         }
6224     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6225         if (sandboxAppHelper_ == nullptr) {
6226             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6227             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6228         }
6229         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
6230         if (ret != ERR_OK) {
6231             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6232             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6233         }
6234     }
6235     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
6236     if (!extension) {
6237         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
6238         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6239     }
6240     if ((static_cast<uint32_t>(flags) &
6241         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6242         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6243         extension->permissions.clear();
6244     }
6245     if ((static_cast<uint32_t>(flags) &
6246         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6247         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6248         extension->metadata.clear();
6249     }
6250     if ((static_cast<uint32_t>(flags) &
6251         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6252         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6253         extension->skills.clear();
6254     }
6255     extensionInfo = (*extension);
6256     if ((static_cast<uint32_t>(flags) &
6257         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6258         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6259         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6260         innerBundleInfo.GetApplicationInfoV9(
6261             static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
6262             responseUserId, extensionInfo.applicationInfo, appIndex);
6263     }
6264     // set uid for NAPI cache use
6265     InnerBundleUserInfo innerBundleUserInfo;
6266     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
6267         extensionInfo.uid = innerBundleUserInfo.uid;
6268         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6269             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
6270             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
6271                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
6272                 extensionInfo.uid = cloneInfo.uid;
6273             }
6274         }
6275     }
6276     extensionInfo.appIndex = appIndex;
6277     return ERR_OK;
6278 }
6279 
FilterExtensionAbilityInfosByModuleName(const std::string & moduleName,std::vector<ExtensionAbilityInfo> & extensionInfos) const6280 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
6281     std::vector<ExtensionAbilityInfo> &extensionInfos) const
6282 {
6283     LOG_D(BMS_TAG_QUERY, "FilterExtensionAbilityInfos moduleName: %{public}s", moduleName.c_str());
6284     if (moduleName.empty()) {
6285         return;
6286     }
6287     for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
6288         if (iter->moduleName != moduleName) {
6289             iter = extensionInfos.erase(iter);
6290         } else {
6291             ++iter;
6292         }
6293     }
6294 }
6295 
ImplicitQueryExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6296 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6297     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6298 {
6299     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6300     if (want.GetAction().empty() && want.GetEntities().empty()
6301         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
6302         LOG_W(BMS_TAG_QUERY, "param invalid");
6303         return false;
6304     }
6305     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
6306         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6307     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
6308 
6309     int32_t requestUserId = GetUserId(userId);
6310     if (requestUserId == Constants::INVALID_USERID) {
6311         return false;
6312     }
6313     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6314     std::string bundleName = want.GetElement().GetBundleName();
6315     if (!bundleName.empty()) {
6316         // query in current bundle
6317         if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
6318             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtension failed, bundleName:%{public}s",
6319                 bundleName.c_str());
6320             return false;
6321         }
6322     } else {
6323         // query all
6324         ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
6325     }
6326     // sort by priority, descending order.
6327     if (extensionInfos.size() > 1) {
6328         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6329             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6330     }
6331     return true;
6332 }
6333 
ImplicitQueryExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6334 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6335     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6336 {
6337     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6338     if (want.GetAction().empty() && want.GetEntities().empty()
6339         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
6340         LOG_W(BMS_TAG_QUERY, "param invalid");
6341         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6342     }
6343     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
6344         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6345     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
6346 
6347     int32_t requestUserId = GetUserId(userId);
6348     if (requestUserId == Constants::INVALID_USERID) {
6349         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6350     }
6351     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6352     std::string bundleName = want.GetElement().GetBundleName();
6353     if (!bundleName.empty()) {
6354         // query in current bundle
6355         ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6356         if (ret != ERR_OK) {
6357             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s",
6358                 bundleName.c_str());
6359             return ret;
6360         }
6361     } else {
6362         // query all
6363         ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6364     }
6365     // sort by priority, descending order.
6366     if (extensionInfos.size() > 1) {
6367         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6368             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6369     }
6370     return ERR_OK;
6371 }
6372 
ImplicitQueryCurExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6373 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6374     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6375 {
6376     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6377     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfos");
6378     std::string bundleName = want.GetElement().GetBundleName();
6379     InnerBundleInfo innerBundleInfo;
6380     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
6381         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6382             bundleName.c_str());
6383         return false;
6384     }
6385     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6386         if (sandboxAppHelper_ == nullptr) {
6387             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6388             return false;
6389         }
6390         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6391         if (ret != ERR_OK) {
6392             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6393             return false;
6394         }
6395     }
6396     if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6397         bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex);
6398         if (!ret) {
6399             LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed errCode %{public}d", ret);
6400             return false;
6401         }
6402     }
6403     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6404     GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6405     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6406     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfos");
6407     return true;
6408 }
6409 
ImplicitQueryCurExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6410 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6411     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6412 {
6413     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6414     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfosV9");
6415     std::string bundleName = want.GetElement().GetBundleName();
6416     InnerBundleInfo innerBundleInfo;
6417     if (appIndex == 0) {
6418         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
6419         if (ret != ERR_OK) {
6420             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6421                 bundleName.c_str());
6422             return ret;
6423         }
6424     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6425         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
6426         if (ret != ERR_OK) {
6427             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6428                 bundleName.c_str());
6429             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6430         }
6431     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6432         if (sandboxAppHelper_ == nullptr) {
6433             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6434             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6435         }
6436         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6437         if (ret != ERR_OK) {
6438             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6439             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6440         }
6441     }
6442     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6443     GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6444     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6445     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfosV9");
6446     return ERR_OK;
6447 }
6448 
ImplicitQueryAllExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6449 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6450     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6451 {
6452     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6453     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6454     int32_t requestUserId = GetUserId(userId);
6455     if (requestUserId == Constants::INVALID_USERID) {
6456         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
6457         return;
6458     }
6459 
6460     // query from bundleInfos_
6461     if (appIndex == 0) {
6462         for (const auto &item : bundleInfos_) {
6463             const InnerBundleInfo &innerBundleInfo = item.second;
6464             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6465             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
6466                 continue;
6467             }
6468             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
6469         }
6470     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6471         // query from sandbox manager for sandbox bundle
6472         if (sandboxAppHelper_ == nullptr) {
6473             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6474             return;
6475         }
6476         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6477         for (const auto &item : sandboxMap) {
6478             InnerBundleInfo info;
6479             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6480             if (pos == std::string::npos) {
6481                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6482                 continue;
6483             }
6484             std::string innerBundleName = item.first.substr(pos + 1);
6485             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6486                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6487                 continue;
6488             }
6489 
6490             int32_t responseUserId = info.GetResponseUserId(userId);
6491             GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
6492         }
6493     } else if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6494         LOG_D(BMS_TAG_QUERY, "start to query extensionAbility in appClone");
6495         for (const auto &item : bundleInfos_) {
6496             int32_t responseUserId = item.second.GetResponseUserId(requestUserId);
6497             const InnerBundleInfo &innerBundleInfo = item.second;
6498             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6499                 LOG_D(BMS_TAG_QUERY,
6500                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6501                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6502                 continue;
6503             }
6504             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6505         }
6506     }
6507     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6508 }
6509 
ImplicitQueryAllExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6510 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6511     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6512 {
6513     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6514     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfosV9");
6515     // query from bundleInfos_
6516     if (appIndex == 0) {
6517         for (const auto &item : bundleInfos_) {
6518             const InnerBundleInfo &innerBundleInfo = item.second;
6519             ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
6520             if (ret != ERR_OK) {
6521                 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6522                     item.first.c_str());
6523                 continue;
6524             }
6525             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6526             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
6527         }
6528     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6529         for (const auto &item : bundleInfos_) {
6530             const InnerBundleInfo &innerBundleInfo = item.second;
6531             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6532             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6533                 LOG_D(BMS_TAG_QUERY,
6534                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6535                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6536                 continue;
6537             }
6538             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6539         }
6540     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6541         // query from sandbox manager for sandbox bundle
6542         if (sandboxAppHelper_ == nullptr) {
6543             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6544             return;
6545         }
6546         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6547         for (const auto &item : sandboxMap) {
6548             InnerBundleInfo info;
6549             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6550             if (pos == std::string::npos) {
6551                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6552                 continue;
6553             }
6554             std::string innerBundleName = item.first.substr(pos + 1);
6555             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6556                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6557                 continue;
6558             }
6559 
6560             int32_t responseUserId = info.GetResponseUserId(userId);
6561             GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
6562         }
6563     }
6564     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfosV9");
6565 }
6566 
GetExtensionAbilityInfoByTypeName(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,const std::string & typeName) const6567 void BundleDataMgr::GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId,
6568     std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const
6569 {
6570     for (const auto &item : bundleInfos_) {
6571         if ((flags &
6572                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
6573                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
6574             if (item.second.GetInnerExtensionInfos().empty() || !item.second.IsSystemApp()) {
6575                 continue;
6576             }
6577             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, userId);
6578             if (!ret) {
6579                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6580                     item.first.c_str());
6581                 continue;
6582             }
6583             int32_t responseUserId = item.second.GetResponseUserId(userId);
6584             GetOneExtensionInfosByExtensionTypeName(typeName, flags, responseUserId, item.second, infos);
6585             if (infos.size() > 0) {
6586                 return;
6587             }
6588         } else {
6589             InnerBundleInfo innerBundleInfo;
6590             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId);
6591             if (!ret) {
6592                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6593                     item.first.c_str());
6594                 continue;
6595             }
6596             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6597             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
6598         }
6599     }
6600 }
6601 
ImplicitQueryAllExtensionInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex,const std::string & typeName) const6602 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
6603     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const
6604 {
6605     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6606     // query from bundleInfos_
6607     if (appIndex == 0) {
6608         GetExtensionAbilityInfoByTypeName(flags, userId, infos, typeName);
6609     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6610         // query from sandbox manager for sandbox bundle
6611         if (sandboxAppHelper_ == nullptr) {
6612             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6613             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6614         }
6615         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6616         for (const auto &item : sandboxMap) {
6617             InnerBundleInfo info;
6618             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6619             if (pos == std::string::npos) {
6620                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6621                 continue;
6622             }
6623             std::string innerBundleName = item.first.substr(pos + 1);
6624             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6625                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6626                 continue;
6627             }
6628             int32_t responseUserId = info.GetResponseUserId(userId);
6629             GetAllExtensionInfos(flags, responseUserId, info, infos, appIndex);
6630         }
6631     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6632         for (const auto &item : bundleInfos_) {
6633             InnerBundleInfo innerBundleInfo;
6634             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId, appIndex);
6635             if (!ret) {
6636                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6637                     item.first.c_str());
6638                 continue;
6639             }
6640             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6641             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos, appIndex);
6642         }
6643     }
6644     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6645     return ERR_OK;
6646 }
6647 
GetMatchExtensionInfos(const Want & want,int32_t flags,const int32_t & userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6648 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
6649     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6650 {
6651     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6652     auto extensionSkillInfos = info.GetExtensionSkillInfos();
6653     auto innerExtensionInfos = info.GetInnerExtensionInfos();
6654     for (const auto &skillInfos : extensionSkillInfos) {
6655         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6656             const Skill &skill = skillInfos.second[skillIndex];
6657             size_t matchUriIndex = 0;
6658             if (!skill.Match(want, matchUriIndex)) {
6659                 continue;
6660             }
6661             if (innerExtensionInfos.find(skillInfos.first) == innerExtensionInfos.end()) {
6662                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6663                     skillInfos.first.c_str());
6664                 break;
6665             }
6666             ExtensionAbilityInfo extensionInfo =
6667                 InnerExtensionInfo::ConvertToExtensionInfo(innerExtensionInfos[skillInfos.first]);
6668             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_APPLICATION) ==
6669                 GET_EXTENSION_INFO_WITH_APPLICATION) {
6670                 info.GetApplicationInfo(
6671                     ApplicationFlag::GET_BASIC_APPLICATION_INFO |
6672                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
6673                     extensionInfo.applicationInfo);
6674             }
6675             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_PERMISSION) !=
6676                 GET_EXTENSION_INFO_WITH_PERMISSION) {
6677                 extensionInfo.permissions.clear();
6678             }
6679             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_METADATA) != GET_EXTENSION_INFO_WITH_METADATA) {
6680                 extensionInfo.metadata.clear();
6681             }
6682             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_SKILL) != GET_EXTENSION_INFO_WITH_SKILL) {
6683                 extensionInfo.skills.clear();
6684             }
6685             if ((static_cast<uint32_t>(flags) &
6686                 GET_EXTENSION_INFO_WITH_SKILL_URI) == GET_EXTENSION_INFO_WITH_SKILL_URI) {
6687                 AddSkillUrisInfo(skillInfos.second, extensionInfo.skillUri, skillIndex, matchUriIndex);
6688             }
6689             extensionInfo.appIndex = appIndex;
6690             infos.emplace_back(extensionInfo);
6691             break;
6692         }
6693     }
6694 }
6695 
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) const6696 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
6697     ExtensionAbilityInfo &extensionInfo, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos,
6698     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
6699 {
6700     if ((static_cast<uint32_t>(flags) &
6701         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6702         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6703         info.GetApplicationInfoV9(static_cast<int32_t>(
6704             GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6705     }
6706     if ((static_cast<uint32_t>(flags) &
6707         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6708         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6709         extensionInfo.permissions.clear();
6710     }
6711     if ((static_cast<uint32_t>(flags) &
6712         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6713         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6714         extensionInfo.metadata.clear();
6715     }
6716     if ((static_cast<uint32_t>(flags) &
6717         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6718         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6719         extensionInfo.skills.clear();
6720     }
6721     if ((static_cast<uint32_t>(flags) &
6722         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) ==
6723         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) {
6724         AddSkillUrisInfo(skills, extensionInfo.skillUri, matchSkillIndex, matchUriIndex);
6725     }
6726     extensionInfo.appIndex = appIndex;
6727     infos.emplace_back(extensionInfo);
6728 }
6729 
GetMatchExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6730 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6731     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6732 {
6733     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
6734     auto extensionSkillInfos = info.GetExtensionSkillInfos();
6735     auto innerExtensionInfos = info.GetInnerExtensionInfos();
6736     for (const auto &skillInfos : extensionSkillInfos) {
6737         if (want.GetAction() == SHARE_ACTION) {
6738             if (!MatchShare(want, skillInfos.second)) {
6739                 continue;
6740             }
6741             if (innerExtensionInfos.find(skillInfos.first) == innerExtensionInfos.end()) {
6742                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6743                     skillInfos.first.c_str());
6744                 continue;
6745             }
6746             ExtensionAbilityInfo extensionInfo =
6747                 InnerExtensionInfo::ConvertToExtensionInfo(innerExtensionInfos[skillInfos.first]);
6748             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6749                 std::nullopt, std::nullopt, appIndex);
6750             continue;
6751         }
6752         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6753             const Skill &skill = skillInfos.second[skillIndex];
6754             size_t matchUriIndex = 0;
6755             if (!skill.Match(want, matchUriIndex)) {
6756                 continue;
6757             }
6758             if (innerExtensionInfos.find(skillInfos.first) == innerExtensionInfos.end()) {
6759                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6760                     skillInfos.first.c_str());
6761                 break;
6762             }
6763             ExtensionAbilityInfo extensionInfo =
6764                 InnerExtensionInfo::ConvertToExtensionInfo(innerExtensionInfos[skillInfos.first]);
6765             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6766                 skillIndex, matchUriIndex, appIndex);
6767             break;
6768         }
6769     }
6770 }
6771 
GetAllExtensionInfos(uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6772 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
6773     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6774 {
6775     auto innerExtensionInfos = info.GetInnerExtensionInfos();
6776     for (const auto &item : innerExtensionInfos) {
6777         ExtensionAbilityInfo extensionInfo = InnerExtensionInfo::ConvertToExtensionInfo(item.second);
6778         if ((flags &
6779             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6780             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6781             info.GetApplicationInfoV9(static_cast<int32_t>(
6782                 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6783         }
6784         if ((flags &
6785             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6786             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6787             extensionInfo.permissions.clear();
6788         }
6789         if ((flags &
6790             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6791             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6792             extensionInfo.metadata.clear();
6793         }
6794         if ((flags &
6795             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6796             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6797             extensionInfo.skills.clear();
6798         }
6799         extensionInfo.appIndex = appIndex;
6800         infos.emplace_back(extensionInfo);
6801     }
6802 }
6803 
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos) const6804 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
6805     std::vector<ExtensionAbilityInfo> &extensionInfos) const
6806 {
6807     int32_t requestUserId = GetUserId(userId);
6808     if (requestUserId == Constants::INVALID_USERID) {
6809         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", requestUserId);
6810         return false;
6811     }
6812     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6813     for (const auto &item : bundleInfos_) {
6814         const InnerBundleInfo &innerBundleInfo = item.second;
6815         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6816         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
6817             continue;
6818         }
6819         auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
6820         for (const auto &info : innerExtensionInfos) {
6821             if (info.second.type == extensionType) {
6822                 ExtensionAbilityInfo extensionAbilityInfo = InnerExtensionInfo::ConvertToExtensionInfo(info.second);
6823                 innerBundleInfo.GetApplicationInfo(
6824                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6825                     extensionAbilityInfo.applicationInfo);
6826                 extensionInfos.emplace_back(extensionAbilityInfo);
6827             }
6828         }
6829     }
6830     return true;
6831 }
6832 
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo) const6833 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
6834     ExtensionAbilityInfo &extensionAbilityInfo) const
6835 {
6836     int32_t requestUserId = GetUserId(userId);
6837     if (requestUserId == Constants::INVALID_USERID) {
6838         LOG_W(BMS_TAG_QUERY, "invalid userId -1");
6839         return false;
6840     }
6841     if (uri.empty()) {
6842         LOG_W(BMS_TAG_QUERY, "uri empty");
6843         return false;
6844     }
6845     std::string convertUri = uri;
6846     // example of valid param uri : fileShare:///com.example.FileShare/person/10
6847     // example of convertUri : fileShare://com.example.FileShare
6848     size_t schemePos = uri.find(PARAM_URI_SEPARATOR);
6849     if (schemePos != uri.npos) {
6850         // 1. cut string
6851         size_t cutPos = uri.find(ServiceConstants::PATH_SEPARATOR, schemePos + PARAM_URI_SEPARATOR_LEN);
6852         if (cutPos != uri.npos) {
6853             convertUri = uri.substr(0, cutPos);
6854         }
6855         // 2. replace :/// with ://
6856         convertUri.replace(schemePos, PARAM_URI_SEPARATOR_LEN, URI_SEPARATOR);
6857     } else {
6858         if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
6859             LOG_W(BMS_TAG_QUERY, "invalid uri : %{private}s", uri.c_str());
6860             return false;
6861         }
6862     }
6863     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6864     if (bundleInfos_.empty()) {
6865         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
6866         return false;
6867     }
6868     for (const auto &item : bundleInfos_) {
6869         const InnerBundleInfo &info = item.second;
6870         if (info.IsDisabled()) {
6871             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
6872             continue;
6873         }
6874 
6875         int32_t responseUserId = info.GetResponseUserId(requestUserId);
6876         if (!info.GetApplicationEnabled(responseUserId)) {
6877             continue;
6878         }
6879 
6880         bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
6881         if (!ret) {
6882             continue;
6883         }
6884         info.GetApplicationInfo(
6885             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6886             extensionAbilityInfo.applicationInfo);
6887         return true;
6888     }
6889     LOG_NOFUNC_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfoByUri (%{public}s) failed", convertUri.c_str());
6890     return false;
6891 }
6892 
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)6893 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
6894     uint32_t resId, int32_t userId, const std::string &localeInfo)
6895 {
6896     APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
6897 #ifdef GLOBAL_RESMGR_ENABLE
6898     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6899     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6900         GetResourceManager(bundleName, moduleName, userId);
6901     if (resourceManager == nullptr) {
6902         APP_LOGW("InitResourceManager failed");
6903         return Constants::EMPTY_STRING;
6904     }
6905     std::string label;
6906     OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
6907     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6908         APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6909         return Constants::EMPTY_STRING;
6910     }
6911     return label;
6912 #else
6913     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6914     return Constants::EMPTY_STRING;
6915 #endif
6916 }
6917 
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)6918 std::string BundleDataMgr::GetIconById(
6919     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
6920 {
6921     APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
6922         bundleName.c_str(), moduleName.c_str(), resId, density);
6923 #ifdef GLOBAL_RESMGR_ENABLE
6924     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
6925     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6926         GetResourceManager(bundleName, moduleName, userId);
6927     if (resourceManager == nullptr) {
6928         APP_LOGW("InitResourceManager failed");
6929         return Constants::EMPTY_STRING;
6930     }
6931     std::string base64;
6932     OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
6933     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6934         APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6935         return Constants::EMPTY_STRING;
6936     }
6937     return base64;
6938 #else
6939     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6940     return Constants::EMPTY_STRING;
6941 #endif
6942 }
6943 
6944 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & bundleName,const std::string & moduleName,int32_t userId,const std::string & localeInfo) const6945 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
6946     const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
6947 {
6948     InnerBundleInfo innerBundleInfo;
6949     if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
6950         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6951         return nullptr;
6952     }
6953     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6954     BundleInfo bundleInfo;
6955     innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
6956     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
6957     if (resourceManager == nullptr) {
6958         APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
6959         return nullptr;
6960     }
6961 
6962     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
6963     if (!resConfig) {
6964         APP_LOGE("resConfig is nullptr");
6965         return nullptr;
6966     }
6967 #ifdef GLOBAL_I18_ENABLE
6968     std::map<std::string, std::string> configs;
6969     OHOS::Global::I18n::LocaleInfo locale(
6970         localeInfo.empty() ? Global::I18n::LocaleConfig::GetEffectiveLanguage() : localeInfo, configs);
6971     resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
6972 #endif
6973     resourceManager->UpdateResConfig(*resConfig);
6974 
6975     for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
6976         std::string moduleResPath;
6977         if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
6978             moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
6979         }
6980         if (!moduleResPath.empty()) {
6981             APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
6982             if (!resourceManager->AddResource(moduleResPath.c_str(), Global::Resource::SELECT_STRING
6983             | Global::Resource::SELECT_MEDIA)) {
6984                 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
6985             }
6986         }
6987     }
6988     return resourceManager;
6989 }
6990 #endif
6991 
GetAllPreInstallBundleInfos()6992 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
6993 {
6994     std::vector<PreInstallBundleInfo> preInstallBundleInfos;
6995     LoadAllPreInstallBundleInfos(preInstallBundleInfos);
6996     return preInstallBundleInfos;
6997 }
6998 
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo) const6999 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
7000     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
7001 {
7002     int32_t requestUserId = GetUserId(userId);
7003     if (requestUserId == Constants::INVALID_USERID) {
7004         APP_LOGW("invalid userId: %{public}d", userId);
7005         return false;
7006     }
7007     std::vector<AbilityInfo> abilityInfos;
7008     bool abilityValid =
7009         ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
7010     std::vector<ExtensionAbilityInfo> extensionInfos;
7011     bool extensionValid =
7012         ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
7013     if (!abilityValid && !extensionValid) {
7014         // both invalid
7015         APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
7016         return false;
7017     }
7018     if (abilityValid && extensionValid) {
7019         // both valid
7020         if (abilityInfos[0].priority >= extensionInfos[0].priority) {
7021             APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
7022             abilityInfo = abilityInfos[0];
7023         } else {
7024             APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
7025                 extensionInfos[0].name.c_str());
7026             extensionInfo = extensionInfos[0];
7027         }
7028     } else if (abilityValid) {
7029         // only ability valid
7030         APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
7031         abilityInfo = abilityInfos[0];
7032     } else {
7033         // only extension valid
7034         APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
7035         extensionInfo = extensionInfos[0];
7036     }
7037     return true;
7038 }
7039 
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos,bool & findDefaultApp)7040 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
7041     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
7042 {
7043     APP_LOGI_NOFUNC("ImplicitQueryInfos action:%{public}s uri:%{private}s type:%{public}s flags:%{public}d "
7044         "userId:%{public}d withDefault:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(),
7045         want.GetType().c_str(), flags, userId, withDefault);
7046 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
7047     // step1 : find default infos
7048     if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
7049         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
7050         if (!abilityInfos.empty() || !extensionInfos.empty()) {
7051             APP_LOGI("find target default application");
7052             findDefaultApp = true;
7053             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
7054                 return true;
7055             }
7056             for (auto &info : abilityInfos) {
7057                 info.linkType = LinkType::DEFAULT_APP;
7058             }
7059         }
7060     }
7061     // step2 : find backup default infos
7062     if (withDefault &&
7063         DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
7064         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
7065         if (!abilityInfos.empty() || !extensionInfos.empty()) {
7066             APP_LOGI("find target backup default application");
7067             findDefaultApp = true;
7068             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
7069                 return true;
7070             }
7071             for (auto &info : abilityInfos) {
7072                 info.linkType = LinkType::DEFAULT_APP;
7073             }
7074         }
7075     }
7076 #endif
7077     // step3 : implicit query infos
7078     bool abilityRet =
7079         ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
7080     APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
7081 
7082     bool extensionRet =
7083         ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
7084     APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
7085 
7086     ImplicitQueryCloneAbilityInfos(want, flags, userId, abilityInfos);
7087     return abilityRet || extensionRet || abilityInfos.size() > 0;
7088 }
7089 
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)7090 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
7091     std::vector<std::string> &dependentModuleNames)
7092 {
7093     APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
7094         bundleName.c_str(), moduleName.c_str());
7095     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7096     auto item = bundleInfos_.find(bundleName);
7097     if (item == bundleInfos_.end()) {
7098         APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
7099         return false;
7100     }
7101     const InnerBundleInfo &innerBundleInfo = item->second;
7102     return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
7103 }
7104 
UpdateRemovable(const std::string & bundleName,bool removable)7105 void BundleDataMgr::UpdateRemovable(
7106     const std::string &bundleName, bool removable)
7107 {
7108     APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
7109     if (bundleName.empty()) {
7110         APP_LOGW("bundleName is empty");
7111         return;
7112     }
7113 
7114     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7115     auto infoItem = bundleInfos_.find(bundleName);
7116     if (infoItem == bundleInfos_.end()) {
7117         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7118         return;
7119     }
7120 
7121     if (infoItem->second.IsRemovable() != removable) {
7122         infoItem->second.UpdateRemovable(true, removable);
7123         SaveInnerBundleInfo(infoItem->second);
7124     }
7125 }
7126 
UpdatePrivilegeCapability(const std::string & bundleName,const ApplicationInfo & appInfo)7127 void BundleDataMgr::UpdatePrivilegeCapability(
7128     const std::string &bundleName, const ApplicationInfo &appInfo)
7129 {
7130     APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
7131     if (bundleName.empty()) {
7132         APP_LOGW("bundleName is empty");
7133         return;
7134     }
7135 
7136     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7137     auto infoItem = bundleInfos_.find(bundleName);
7138     if (infoItem == bundleInfos_.end()) {
7139         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7140         return;
7141     }
7142 
7143     infoItem->second.UpdatePrivilegeCapability(appInfo);
7144 }
7145 
FetchInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)7146 bool BundleDataMgr::FetchInnerBundleInfo(
7147     const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
7148 {
7149     APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
7150     if (bundleName.empty()) {
7151         APP_LOGW("bundleName is empty");
7152         return false;
7153     }
7154 
7155     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7156     auto infoItem = bundleInfos_.find(bundleName);
7157     if (infoItem == bundleInfos_.end()) {
7158         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
7159         return false;
7160     }
7161 
7162     innerBundleInfo = infoItem->second;
7163     return true;
7164 }
7165 
GetInnerBundleInfoUsers(const std::string & bundleName,std::set<int32_t> & userIds)7166 bool BundleDataMgr::GetInnerBundleInfoUsers(const std::string &bundleName, std::set<int32_t> &userIds)
7167 {
7168     InnerBundleInfo info;
7169     if (!FetchInnerBundleInfo(bundleName, info)) {
7170         APP_LOGW("FetchInnerBundleInfo failed");
7171         return false;
7172     }
7173     std::map<std::string, InnerBundleUserInfo> userInfos = info.GetInnerBundleUserInfos();
7174     for (const auto &userInfo : userInfos) {
7175         userIds.insert(userInfo.second.bundleUserInfo.userId);
7176     }
7177     return true;
7178 }
7179 
IsSystemHsp(const std::string & bundleName)7180 bool BundleDataMgr::IsSystemHsp(const std::string &bundleName)
7181 {
7182     InnerBundleInfo info;
7183     if (!FetchInnerBundleInfo(bundleName, info)) {
7184         APP_LOGW("FetchInnerBundleInfo %{public}s failed", bundleName.c_str());
7185         return false;
7186     }
7187     return info.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK;
7188 }
7189 
7190 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId,const Element & element,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo,std::vector<Skill> & skills) const7191 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
7192     AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
7193 {
7194     APP_LOGD("begin to QueryInfoAndSkillsByElement");
7195     const std::string& bundleName = element.bundleName;
7196     const std::string& moduleName = element.moduleName;
7197     const std::string& abilityName = element.abilityName;
7198     const std::string& extensionName = element.extensionName;
7199     Want want;
7200     ElementName elementName("", bundleName, abilityName, moduleName);
7201     want.SetElement(elementName);
7202     bool isAbility = !element.abilityName.empty();
7203     bool ret = false;
7204     if (isAbility) {
7205         // get ability info
7206         ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
7207         if (!ret) {
7208             LOG_I(BMS_TAG_QUERY, "ExplicitQueryAbility no match -n %{public}s -m %{public}s -a %{public}s"
7209                 " -u %{public}d", bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), userId);
7210             return false;
7211         }
7212     } else {
7213         // get extension info
7214         elementName.SetAbilityName(extensionName);
7215         want.SetElement(elementName);
7216         ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
7217         if (!ret) {
7218             APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
7219             return false;
7220         }
7221     }
7222 
7223     // get skills info
7224     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7225     if (bundleInfos_.empty()) {
7226         APP_LOGW("bundleInfos_ is empty");
7227         return false;
7228     }
7229     auto item = bundleInfos_.find(bundleName);
7230     if (item == bundleInfos_.end()) {
7231         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7232         return false;
7233     }
7234     const InnerBundleInfo& innerBundleInfo = item->second;
7235     if (isAbility) {
7236         std::string key;
7237         key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
7238         APP_LOGD("begin to find ability skills, key : %{public}s", key.c_str());
7239         for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
7240             if (infoItem.first == key) {
7241                 skills = infoItem.second;
7242                 APP_LOGD("find ability skills success");
7243                 break;
7244             }
7245         }
7246     } else {
7247         std::string key;
7248         key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
7249         APP_LOGD("begin to find extension skills, key : %{public}s", key.c_str());
7250         for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
7251             if (infoItem.first == key) {
7252                 skills = infoItem.second;
7253                 APP_LOGD("find extension skills success");
7254                 break;
7255             }
7256         }
7257     }
7258     APP_LOGD("QueryInfoAndSkillsByElement success");
7259     return true;
7260 }
7261 
GetElement(int32_t userId,const ElementName & elementName,Element & element) const7262 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
7263 {
7264     APP_LOGD("begin to GetElement");
7265     const std::string& bundleName = elementName.GetBundleName();
7266     const std::string& moduleName = elementName.GetModuleName();
7267     const std::string& abilityName = elementName.GetAbilityName();
7268     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
7269         APP_LOGW("bundleName or moduleName or abilityName is empty");
7270         return false;
7271     }
7272     Want want;
7273     want.SetElement(elementName);
7274     AbilityInfo abilityInfo;
7275     bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
7276     if (ret) {
7277         APP_LOGD("ElementName is ability");
7278         element.bundleName = bundleName;
7279         element.moduleName = moduleName;
7280         element.abilityName = abilityName;
7281         return true;
7282     }
7283 
7284     ExtensionAbilityInfo extensionInfo;
7285     ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
7286     if (ret) {
7287         APP_LOGD("ElementName is extension");
7288         element.bundleName = bundleName;
7289         element.moduleName = moduleName;
7290         element.extensionName = abilityName;
7291         return true;
7292     }
7293 
7294     if (DelayedSingleton<BundleMgrService>::GetInstance()->IsBrokerServiceStarted()) {
7295         APP_LOGI("query ability from broker");
7296         AbilityInfo brokerAbilityInfo;
7297         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
7298         ErrCode resultCode = bmsExtensionClient->QueryAbilityInfo(want, 0, userId, brokerAbilityInfo, true);
7299         if (resultCode == ERR_OK) {
7300             APP_LOGI("ElementName is brokerAbility");
7301             element.bundleName = bundleName;
7302             element.moduleName = moduleName;
7303             element.abilityName = abilityName;
7304             return true;
7305         }
7306     }
7307 
7308     APP_LOGW("ElementName doesn't exist");
7309     return false;
7310 }
7311 #endif
7312 
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) const7313 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
7314     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
7315 {
7316     APP_LOGI("begin");
7317 #ifdef GLOBAL_RESMGR_ENABLE
7318     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7319     int32_t requestUserId = GetUserId(userId);
7320     if (requestUserId == Constants::INVALID_USERID) {
7321         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7322     }
7323     InnerBundleInfo innerBundleInfo;
7324     ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
7325         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
7326     if (errCode != ERR_OK) {
7327         return errCode;
7328     }
7329     AbilityInfo abilityInfo;
7330     errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
7331     if (errCode != ERR_OK) {
7332         return errCode;
7333     }
7334     bool isEnable = false;
7335     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
7336     errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
7337     if (errCode != ERR_OK) {
7338         return errCode;
7339     }
7340     if (!isEnable) {
7341         APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
7342         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
7343     }
7344     std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
7345         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
7346     if (resourceManager == nullptr) {
7347         APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
7348         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7349     }
7350     OHOS::Global::Resource::RState ret =
7351         resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
7352     if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
7353         APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
7354         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7355     }
7356     return ERR_OK;
7357 #else
7358     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
7359 #endif
7360 }
7361 
GetStatusCallbackMutex()7362 ffrt::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
7363 {
7364     return callbackMutex_;
7365 }
7366 
GetCallBackList() const7367 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
7368 {
7369     return callbackList_;
7370 }
7371 
UpdateQuickFixInnerBundleInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)7372 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
7373     const InnerBundleInfo &innerBundleInfo)
7374 {
7375     APP_LOGD("to update info:%{public}s", bundleName.c_str());
7376     if (bundleName.empty()) {
7377         APP_LOGW("update info fail, empty bundle name");
7378         return false;
7379     }
7380 
7381     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7382     auto infoItem = bundleInfos_.find(bundleName);
7383     if (infoItem == bundleInfos_.end()) {
7384         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7385         return false;
7386     }
7387 
7388     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7389         bundleInfos_.at(bundleName) = innerBundleInfo;
7390         return true;
7391     }
7392     APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
7393     return false;
7394 }
7395 
UpdateInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,bool needSaveStorage)7396 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo, bool needSaveStorage)
7397 {
7398     std::string bundleName = innerBundleInfo.GetBundleName();
7399     if (bundleName.empty()) {
7400         APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
7401         return false;
7402     }
7403     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
7404     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7405     auto infoItem = bundleInfos_.find(bundleName);
7406     if (infoItem == bundleInfos_.end()) {
7407         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7408         return false;
7409     }
7410 
7411     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7412         APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
7413         return false;
7414     }
7415     bundleInfos_.at(bundleName) = innerBundleInfo;
7416     return true;
7417 }
7418 
UpdateEl5KeyId(const CreateDirParam & el5Param,const std::string keyId,bool needSaveStorage)7419 bool BundleDataMgr::UpdateEl5KeyId(const CreateDirParam &el5Param, const std::string keyId, bool needSaveStorage)
7420 {
7421     if (el5Param.bundleName.empty()) {
7422         APP_LOGW("UpdateEl5KeyId failed, empty bundle name");
7423         return false;
7424     }
7425     APP_LOGD("UpdateEl5KeyId:%{public}s", el5Param.bundleName.c_str());
7426     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7427     auto infoItem = bundleInfos_.find(el5Param.bundleName);
7428     if (infoItem == bundleInfos_.end()) {
7429         APP_LOGW("bundle:%{public}s info is not existed", el5Param.bundleName.c_str());
7430         return false;
7431     }
7432     std::string oldKeyId = infoItem->second.GetKeyId(el5Param.userId, el5Param.appIndex);
7433     infoItem->second.SetkeyId(el5Param.userId, keyId, el5Param.appIndex);
7434 
7435     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(infoItem->second)) {
7436         APP_LOGE("to update InnerBundleInfo:%{public}s failed", el5Param.bundleName.c_str());
7437         infoItem->second.InnerSetKeyId(el5Param.userId, oldKeyId, el5Param.appIndex);
7438         return false;
7439     }
7440     return true;
7441 }
7442 
QueryOverlayInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)7443 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
7444 {
7445     APP_LOGD("start to query overlay innerBundleInfo");
7446     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7447     if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
7448         info = bundleInfos_.at(bundleName);
7449         return true;
7450     }
7451 
7452     APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7453     return false;
7454 }
7455 
SaveOverlayInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)7456 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
7457 {
7458     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7459     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
7460     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7461         APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
7462         return;
7463     }
7464     bundleInfos_.at(bundleName) = innerBundleInfo;
7465 }
7466 
GetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)7467 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
7468     AppProvisionInfo &appProvisionInfo)
7469 {
7470     if (!HasUserId(userId)) {
7471         APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
7472         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7473     }
7474     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7475     auto infoItem = bundleInfos_.find(bundleName);
7476     if (infoItem == bundleInfos_.end()) {
7477         APP_LOGW_NOFUNC("-n %{public}s not exist", bundleName.c_str());
7478         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7479     }
7480     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7481         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7482         if (responseUserId == Constants::INVALID_USERID) {
7483             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7484         }
7485     }
7486     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
7487         APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
7488         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7489     }
7490     return ERR_OK;
7491 }
7492 
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas) const7493 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
7494     std::vector<Metadata> &provisionMetadatas) const
7495 {
7496     // Reserved interface
7497     return ERR_OK;
7498 }
7499 
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles) const7500 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
7501 {
7502     APP_LOGD("GetAllSharedBundleInfo");
7503     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7504 
7505     for (const auto& [key, innerBundleInfo] : bundleInfos_) {
7506         if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7507             continue;
7508         }
7509         SharedBundleInfo sharedBundleInfo;
7510         innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7511         sharedBundles.emplace_back(sharedBundleInfo);
7512     }
7513 
7514     return ERR_OK;
7515 }
7516 
GetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)7517 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
7518     std::vector<SharedBundleInfo> &sharedBundles)
7519 {
7520     APP_LOGD("GetSharedBundleInfo");
7521     if (bundleName.empty() || moduleName.empty()) {
7522         APP_LOGW("bundleName or moduleName is empty");
7523         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7524     }
7525 
7526     std::vector<Dependency> dependencies;
7527     ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
7528     if (errCode != ERR_OK) {
7529         APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
7530             errCode, bundleName.c_str());
7531         return errCode;
7532     }
7533 
7534     for (const auto& dep : dependencies) {
7535         SharedBundleInfo sharedBundleInfo;
7536         errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
7537         if (errCode != ERR_OK) {
7538             APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
7539                 errCode, bundleName.c_str());
7540             return errCode;
7541         }
7542         sharedBundles.emplace_back(sharedBundleInfo);
7543     }
7544 
7545     return ERR_OK;
7546 }
7547 
GetSharedBundleInfoBySelf(const std::string & bundleName,SharedBundleInfo & sharedBundleInfo)7548 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
7549 {
7550     APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
7551     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7552     auto infoItem = bundleInfos_.find(bundleName);
7553     if (infoItem == bundleInfos_.end()) {
7554         APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
7555             bundleName.c_str());
7556         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7557     }
7558     const InnerBundleInfo &innerBundleInfo = infoItem->second;
7559     if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7560         APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
7561             bundleName.c_str());
7562         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7563     }
7564     innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7565     APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
7566     return ERR_OK;
7567 }
7568 
GetSharedDependencies(const std::string & bundleName,const std::string & moduleName,std::vector<Dependency> & dependencies)7569 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
7570     std::vector<Dependency> &dependencies)
7571 {
7572     APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
7573         bundleName.c_str(), moduleName.c_str());
7574     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7575     auto item = bundleInfos_.find(bundleName);
7576     if (item == bundleInfos_.end()) {
7577         APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
7578         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7579     }
7580     const InnerBundleInfo &innerBundleInfo = item->second;
7581     if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
7582         APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
7583         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7584     }
7585     APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
7586         bundleName.c_str(), moduleName.c_str());
7587     return ERR_OK;
7588 }
7589 
CheckHspVersionIsRelied(int32_t versionCode,const InnerBundleInfo & info) const7590 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
7591 {
7592     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7593     std::string hspBundleName = info.GetBundleName();
7594     if (versionCode == Constants::ALL_VERSIONCODE) {
7595         // uninstall hsp bundle, check other bundle denpendency
7596         return CheckHspBundleIsRelied(hspBundleName);
7597     }
7598     std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
7599     // check whether has higher version
7600     std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
7601     for (const auto &item : versionCodes) {
7602         if (item > static_cast<uint32_t>(versionCode)) {
7603             return false;
7604         }
7605     }
7606     // check other bundle denpendency
7607     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7608         if (bundleName == hspBundleName) {
7609             continue;
7610         }
7611         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7612         for (const auto &dependencyItem : dependencyList) {
7613             if (dependencyItem.bundleName == hspBundleName &&
7614                 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
7615                 return true;
7616             }
7617         }
7618     }
7619     return false;
7620 }
7621 
CheckHspBundleIsRelied(const std::string & hspBundleName) const7622 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
7623 {
7624     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7625         if (bundleName == hspBundleName) {
7626             continue;
7627         }
7628         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7629         for (const auto &dependencyItem : dependencyList) {
7630             if (dependencyItem.bundleName == hspBundleName) {
7631                 return true;
7632             }
7633         }
7634     }
7635     return false;
7636 }
7637 
GetSharedBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo)7638 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
7639 {
7640     if (bundleName.empty()) {
7641         APP_LOGW("bundleName is empty");
7642         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7643     }
7644 
7645     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7646     auto infoItem = bundleInfos_.find(bundleName);
7647     if (infoItem == bundleInfos_.end()) {
7648         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7649         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7650     }
7651     const InnerBundleInfo &innerBundleInfo = infoItem->second;
7652     innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
7653     return ERR_OK;
7654 }
7655 
IsPreInstallApp(const std::string & bundleName)7656 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
7657 {
7658     APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
7659     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7660     auto item = bundleInfos_.find(bundleName);
7661     if (item == bundleInfos_.end()) {
7662         APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
7663             bundleName.c_str());
7664         return false;
7665     }
7666     return item->second.IsPreInstallApp();
7667 }
7668 
GetProxyDataInfos(const std::string & bundleName,const std::string & moduleName,int32_t userId,std::vector<ProxyData> & proxyDatas) const7669 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
7670     int32_t userId, std::vector<ProxyData> &proxyDatas) const
7671 {
7672     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7673     InnerBundleInfo info;
7674     auto ret = GetInnerBundleInfoWithBundleFlagsV9(
7675         bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
7676     if (ret != ERR_OK) {
7677         APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7678         return ret;
7679     }
7680     return info.GetProxyDataInfos(moduleName, proxyDatas);
7681 }
7682 
GetAllProxyDataInfos(int32_t userId,std::vector<ProxyData> & proxyDatas) const7683 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
7684 {
7685     std::vector<BundleInfo> bundleInfos;
7686     auto ret = GetBundleInfosV9(
7687         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
7688     if (ret != ERR_OK) {
7689         APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
7690         return ret;
7691     }
7692     for (const auto &bundleInfo : bundleInfos) {
7693         for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
7694             proxyDatas.insert(
7695                 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
7696         }
7697     }
7698     return ERR_OK;
7699 }
7700 
GetBundleNameByAppId(const std::string & appId) const7701 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
7702 {
7703     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7704     auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
7705         return appId == pair.second.GetAppId();
7706     });
7707     if (it == bundleInfos_.cend()) {
7708         APP_LOGW("invalid appId, can't find bundleName");
7709         return Constants::EMPTY_STRING;
7710     }
7711     return it->second.GetBundleName();
7712 }
7713 
SetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,AOTCompileStatus aotCompileStatus,uint32_t versionCode)7714 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7715     AOTCompileStatus aotCompileStatus, uint32_t versionCode)
7716 {
7717     APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
7718         bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
7719     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7720     auto item = bundleInfos_.find(bundleName);
7721     if (item == bundleInfos_.end()) {
7722         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7723         (void)InstalldClient::GetInstance()->RemoveDir(ServiceConstants::ARK_CACHE_PATH + bundleName);
7724         return;
7725     }
7726     if (item->second.GetVersionCode() != versionCode) {
7727         APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
7728             versionCode, item->second.GetVersionCode(), bundleName.c_str());
7729         return;
7730     }
7731     item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
7732     std::string abi;
7733     std::string path;
7734     if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
7735         abi = ServiceConstants::ARM64_V8A;
7736         path = std::string(ServiceConstants::ARM64) + ServiceConstants::PATH_SEPARATOR;
7737     }
7738     item->second.SetArkNativeFileAbi(abi);
7739     item->second.SetArkNativeFilePath(path);
7740     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7741         APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
7742     }
7743 }
7744 
ResetAOTFlags()7745 void BundleDataMgr::ResetAOTFlags()
7746 {
7747     APP_LOGI("ResetAOTFlags begin");
7748     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7749     std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
7750         if (item.second.IsAOTFlagsInitial()) {
7751             return;
7752         }
7753         item.second.ResetAOTFlags();
7754         if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
7755             APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
7756         }
7757     });
7758     APP_LOGI("ResetAOTFlags end");
7759 }
7760 
ResetAOTFlagsCommand(const std::string & bundleName)7761 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
7762 {
7763     APP_LOGI("ResetAOTFlagsCommand begin");
7764     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7765     auto item = bundleInfos_.find(bundleName);
7766     if (item == bundleInfos_.end()) {
7767         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7768         return;
7769     }
7770     if (item->second.IsAOTFlagsInitial()) {
7771         return;
7772     }
7773     item->second.ResetAOTFlags();
7774     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7775         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7776         return;
7777     }
7778     APP_LOGI("ResetAOTFlagsCommand end");
7779 }
7780 
ResetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,int32_t triggerMode)7781 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7782     int32_t triggerMode)
7783 {
7784     APP_LOGI("ResetAOTCompileStatus begin");
7785     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7786     auto item = bundleInfos_.find(bundleName);
7787     if (item == bundleInfos_.end()) {
7788         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7789         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7790     }
7791     ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
7792     if (ret != ERR_OK) {
7793         return ret;
7794     }
7795     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7796         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7797         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7798     }
7799     APP_LOGI("ResetAOTCompileStatus end");
7800     return ERR_OK;
7801 }
7802 
GetAllBundleName() const7803 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
7804 {
7805     APP_LOGD("GetAllBundleName begin");
7806     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7807     std::vector<std::string> bundleNames;
7808     bundleNames.reserve(bundleInfos_.size());
7809     std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
7810         return item.first;
7811     });
7812     return bundleNames;
7813 }
7814 
GetAllSystemHspCodePaths() const7815 std::vector<std::string> BundleDataMgr::GetAllSystemHspCodePaths() const
7816 {
7817     std::vector<std::string> systemHspCodePaths;
7818     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7819     for (const auto &item : bundleInfos_) {
7820         if (item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
7821             std::string installPath = item.second.GetAppCodePath();
7822             APP_LOGD("get appcodepath:%{public}s for %{public}s",
7823                 installPath.c_str(), item.second.GetBundleName().c_str());
7824             systemHspCodePaths.emplace_back(installPath);
7825         }
7826     }
7827     return systemHspCodePaths;
7828 }
7829 
GetAllExtensionBundleNames(const std::vector<ExtensionAbilityType> & types) const7830 std::vector<std::string> BundleDataMgr::GetAllExtensionBundleNames(const std::vector<ExtensionAbilityType> &types) const
7831 {
7832     APP_LOGD("GetAllExtensionBundleNames begin");
7833     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7834     std::vector<std::string> bundleNames;
7835     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7836         const auto extensionAbilityInfos = innerBundleInfo.GetInnerExtensionInfos();
7837         for (const auto &extensionItem : extensionAbilityInfos) {
7838             if (std::find(types.begin(), types.end(), extensionItem.second.type) != types.end()) {
7839                 bundleNames.emplace_back(bundleName);
7840                 break;
7841             }
7842         }
7843     }
7844     return bundleNames;
7845 }
7846 
GetAllLiteBundleInfo(const int32_t userId) const7847 std::vector<std::tuple<std::string, int32_t, int32_t>> BundleDataMgr::GetAllLiteBundleInfo(const int32_t userId) const
7848 {
7849     std::set<int32_t> userIds = GetAllUser();
7850     if (userIds.find(userId) == userIds.end()) {
7851         APP_LOGW("invalid userId");
7852         return {};
7853     }
7854     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7855     std::vector<std::tuple<std::string, int32_t, int32_t>> bundles;
7856     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7857         auto installedUsers = innerBundleInfo.GetUsers();
7858         if (installedUsers.find(userId) == installedUsers.end()) {
7859             continue;
7860         }
7861         bundles.emplace_back(bundleName, innerBundleInfo.GetUid(userId), innerBundleInfo.GetGid(userId));
7862     }
7863     return bundles;
7864 }
7865 
GetBundleNamesForNewUser() const7866 std::vector<std::string> BundleDataMgr::GetBundleNamesForNewUser() const
7867 {
7868     APP_LOGD("begin");
7869     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7870     std::vector<std::string> bundleNames;
7871     for (const auto &item : bundleInfos_) {
7872         if (item.second.GetApplicationBundleType() == BundleType::SHARED ||
7873             item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
7874             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
7875                 item.second.GetBundleName().c_str());
7876             continue;
7877         }
7878         // this function is used to install additional bundle in new user, so ignore pre-install app
7879         if (item.second.IsPreInstallApp()) {
7880             APP_LOGD("app %{public}s is pre-install app, ignore", item.second.GetBundleName().c_str());
7881             continue;
7882         }
7883         if (item.second.IsInstalledForAllUser() &&
7884             OHOS::system::GetBoolParameter(ServiceConstants::IS_ENTERPRISE_DEVICE, false)) {
7885             APP_LOGI("%{public}s is installed for all user", item.second.GetBundleName().c_str());
7886             bundleNames.emplace_back(item.second.GetBundleName());
7887             continue;
7888         }
7889         const auto extensions = item.second.GetInnerExtensionInfos();
7890         for (const auto &extensionItem : extensions) {
7891             if (extensionItem.second.type == ExtensionAbilityType::DRIVER &&
7892                 OHOS::system::GetBoolParameter(ServiceConstants::IS_DRIVER_FOR_ALL_USERS, true)) {
7893                 bundleNames.emplace_back(extensionItem.second.bundleName);
7894                 APP_LOGI("driver bundle found: %{public}s", extensionItem.second.bundleName.c_str());
7895                 break;
7896             }
7897         }
7898     }
7899     return bundleNames;
7900 }
7901 
QueryInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info) const7902 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
7903 {
7904     APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
7905     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7906     auto item = bundleInfos_.find(bundleName);
7907     if (item == bundleInfos_.end()) {
7908         APP_LOGW_NOFUNC("QueryInnerBundleInfo not find %{public}s", bundleName.c_str());
7909         return false;
7910     }
7911     info = item->second;
7912     return true;
7913 }
7914 
GetUserIds(const std::string & bundleName) const7915 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
7916 {
7917     APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
7918     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7919     std::vector<int32_t> userIds;
7920     auto infoItem = bundleInfos_.find(bundleName);
7921     if (infoItem == bundleInfos_.end()) {
7922         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7923         return userIds;
7924     }
7925     auto userInfos = infoItem->second.GetInnerBundleUserInfos();
7926     std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
7927         return item.second.bundleUserInfo.userId;
7928     });
7929     return userIds;
7930 }
7931 
CreateAppEl5GroupDir(const std::string & bundleName,int32_t userId)7932 void BundleDataMgr::CreateAppEl5GroupDir(const std::string &bundleName, int32_t userId)
7933 {
7934     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7935     auto bundleInfoItem = bundleInfos_.find(bundleName);
7936     if (bundleInfoItem == bundleInfos_.end()) {
7937         APP_LOGW("%{public}s not found", bundleName.c_str());
7938         return;
7939     }
7940     bool needCreateEl5Dir = bundleInfoItem->second.NeedCreateEl5Dir();
7941     if (!needCreateEl5Dir) {
7942         return;
7943     }
7944     auto dataGroupInfoMap = bundleInfoItem->second.GetDataGroupInfos();
7945     if (dataGroupInfoMap.empty()) {
7946         return;
7947     }
7948     std::vector<DataGroupInfo> dataGroupInfos;
7949     for (const auto &groupItem : dataGroupInfoMap) {
7950         for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7951             if (dataGroupInfo.userId == userId) {
7952                 dataGroupInfos.emplace_back(dataGroupInfo);
7953             }
7954         }
7955     }
7956     if (CreateEl5GroupDirs(dataGroupInfos, userId) != ERR_OK) {
7957         APP_LOGW("create el5 group dirs for %{public}s %{public}d failed", bundleName.c_str(), userId);
7958     }
7959 }
7960 
CreateAppGroupDir(const InnerBundleInfo & info,int32_t userId)7961 bool BundleDataMgr::CreateAppGroupDir(const InnerBundleInfo &info, int32_t userId)
7962 {
7963     auto dataGroupInfoMap = info.GetDataGroupInfos();
7964     if (dataGroupInfoMap.empty()) {
7965         return true;
7966     }
7967     std::vector<DataGroupInfo> dataGroupInfos;
7968     for (const auto &groupItem : dataGroupInfoMap) {
7969         for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7970             if (dataGroupInfo.userId == userId) {
7971                 dataGroupInfos.emplace_back(dataGroupInfo);
7972             }
7973         }
7974     }
7975     bool needCreateEl5Dir = info.NeedCreateEl5Dir();
7976     return CreateGroupDirs(dataGroupInfos, userId, needCreateEl5Dir) == ERR_OK;
7977 }
7978 
CreateAppGroupDir(const std::string & bundleName,int32_t userId)7979 bool BundleDataMgr::CreateAppGroupDir(const std::string &bundleName, int32_t userId)
7980 {
7981     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
7982     auto bundleInfoItem = bundleInfos_.find(bundleName);
7983     if (bundleInfoItem == bundleInfos_.end()) {
7984         APP_LOGW("%{public}s not found", bundleName.c_str());
7985         return false;
7986     }
7987     return CreateAppGroupDir(bundleInfoItem->second, userId);
7988 }
7989 
CreateGroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId,bool needCreateEl5Dir)7990 ErrCode BundleDataMgr::CreateGroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId,
7991     bool needCreateEl5Dir)
7992 {
7993     if (dataGroupInfos.empty()) {
7994         return ERR_OK;
7995     }
7996     std::vector<CreateDirParam> params;
7997     for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
7998         CreateDirParam param;
7999         param.uuid = dataGroupInfo.uuid;
8000         param.uid = dataGroupInfo.uid;
8001         param.gid = dataGroupInfo.gid;
8002         param.userId = dataGroupInfo.userId;
8003         params.emplace_back(param);
8004     }
8005     ErrCode res = ERR_OK;
8006     auto nonEl5Res = InstalldClient::GetInstance()->CreateDataGroupDirs(params);
8007     if (nonEl5Res != ERR_OK) {
8008         APP_LOGE("mkdir group dir failed %{public}d", nonEl5Res);
8009         res = nonEl5Res;
8010     }
8011     if (!needCreateEl5Dir) {
8012         return res;
8013     }
8014     auto el5Res = CreateEl5GroupDirs(dataGroupInfos, userId);
8015     if (el5Res != ERR_OK) {
8016         APP_LOGE("el5Res %{public}d", el5Res);
8017         res = el5Res;
8018     }
8019     return res;
8020 }
8021 
CreateEl5GroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId)8022 ErrCode BundleDataMgr::CreateEl5GroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId)
8023 {
8024     if (dataGroupInfos.empty()) {
8025         return ERR_OK;
8026     }
8027     std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
8028         ServiceConstants::PATH_SEPARATOR + std::to_string(userId);
8029     if (!BundleUtil::IsExistDir(parentDir)) {
8030         APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
8031         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8032     }
8033     ErrCode res = ERR_OK;
8034     for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
8035         // create el5 group dirs
8036         std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
8037         auto result = InstalldClient::GetInstance()->Mkdir(dir,
8038             ServiceConstants::DATA_GROUP_DIR_MODE, dataGroupInfo.uid, dataGroupInfo.gid);
8039         if (result != ERR_OK) {
8040             APP_LOGW("id %{public}s group dir %{private}s userId %{public}d failed",
8041                 dataGroupInfo.dataGroupId.c_str(), dataGroupInfo.uuid.c_str(), userId);
8042             res = result;
8043         }
8044         // set el5 group dirs encryption policy
8045         EncryptionParam encryptionParam("", dataGroupInfo.uuid, dataGroupInfo.uid, userId, EncryptionDirType::GROUP);
8046         std::string keyId = "";
8047         auto setPolicyRes = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
8048         if (setPolicyRes != ERR_OK) {
8049             LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
8050             res = setPolicyRes;
8051         }
8052     }
8053     return res;
8054 }
8055 
GetSpecifiedDistributionType(const std::string & bundleName,std::string & specifiedDistributionType)8056 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
8057     const std::string &bundleName, std::string &specifiedDistributionType)
8058 {
8059     APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
8060     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8061     auto infoItem = bundleInfos_.find(bundleName);
8062     if (infoItem == bundleInfos_.end()) {
8063         APP_LOGW_NOFUNC("-n %{public}s does not exist", bundleName.c_str());
8064         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8065     }
8066     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8067         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8068         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8069         if (responseUserId == Constants::INVALID_USERID) {
8070             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
8071             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8072         }
8073     }
8074     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
8075         specifiedDistributionType)) {
8076         APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed", bundleName.c_str());
8077         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8078     }
8079     return ERR_OK;
8080 }
8081 
GetAdditionalInfo(const std::string & bundleName,std::string & additionalInfo)8082 ErrCode BundleDataMgr::GetAdditionalInfo(
8083     const std::string &bundleName, std::string &additionalInfo)
8084 {
8085     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
8086     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8087     auto infoItem = bundleInfos_.find(bundleName);
8088     if (infoItem == bundleInfos_.end()) {
8089         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
8090         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8091     }
8092     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8093         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8094         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8095         if (responseUserId == Constants::INVALID_USERID) {
8096             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
8097             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8098         }
8099     }
8100     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
8101         additionalInfo)) {
8102         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
8103         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8104     }
8105     return ERR_OK;
8106 }
8107 
GetAdditionalInfoForAllUser(const std::string & bundleName,std::string & additionalInfo)8108 ErrCode BundleDataMgr::GetAdditionalInfoForAllUser(
8109     const std::string &bundleName, std::string &additionalInfo)
8110 {
8111     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
8112     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8113     auto infoItem = bundleInfos_.find(bundleName);
8114     if (infoItem == bundleInfos_.end()) {
8115         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
8116         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8117     }
8118     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
8119         additionalInfo)) {
8120         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
8121         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8122     }
8123     return ERR_OK;
8124 }
8125 
SetExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)8126 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
8127     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
8128 {
8129     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8130     auto item = bundleInfos_.find(bundleName);
8131     if (item == bundleInfos_.end()) {
8132         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
8133         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8134     }
8135     ErrCode ret;
8136     if (!extName.empty()) {
8137         ret = item->second.SetExtName(moduleName, abilityName, extName);
8138         if (ret != ERR_OK) {
8139             APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
8140             return ret;
8141         }
8142     }
8143     if (!mimeType.empty()) {
8144         ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
8145         if (ret != ERR_OK) {
8146             APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
8147             return ret;
8148         }
8149     }
8150     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
8151         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
8152         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8153     }
8154     return ERR_OK;
8155 }
8156 
DelExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)8157 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
8158     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
8159 {
8160     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8161     auto item = bundleInfos_.find(bundleName);
8162     if (item == bundleInfos_.end()) {
8163         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
8164         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8165     }
8166     ErrCode ret;
8167     if (!extName.empty()) {
8168         ret = item->second.DelExtName(moduleName, abilityName, extName);
8169         if (ret != ERR_OK) {
8170             APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
8171             return ret;
8172         }
8173     }
8174     if (!mimeType.empty()) {
8175         ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
8176         if (ret != ERR_OK) {
8177             APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
8178             return ret;
8179         }
8180     }
8181     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
8182         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
8183         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8184     }
8185     return ERR_OK;
8186 }
8187 
MatchPrivateType(const Want & want,const std::vector<std::string> & supportExtNames,const std::vector<std::string> & supportMimeTypes,const std::vector<std::string> & paramMimeTypes) const8188 bool BundleDataMgr::MatchPrivateType(const Want &want,
8189     const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes,
8190     const std::vector<std::string> &paramMimeTypes) const
8191 {
8192     std::string uri = want.GetUriString();
8193     APP_LOGD("MatchPrivateType, uri is %{private}s", uri.c_str());
8194     auto suffixIndex = uri.rfind('.');
8195     if (suffixIndex == std::string::npos) {
8196         return false;
8197     }
8198     std::string suffix = uri.substr(suffixIndex + 1);
8199     bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
8200         return extName == suffix;
8201     });
8202     if (supportPrivateType) {
8203         APP_LOGI("uri is a supported private-type file");
8204         return true;
8205     }
8206 
8207     if (!paramMimeTypes.empty()) {
8208         auto iter = std::find_first_of(
8209             paramMimeTypes.begin(), paramMimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
8210         if (iter != paramMimeTypes.end()) {
8211             APP_LOGI("uri is a supported mime-type file");
8212             return true;
8213         }
8214     }
8215     return false;
8216 }
8217 
QueryAppGalleryAbilityName(std::string & bundleName,std::string & abilityName)8218 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
8219 {
8220     APP_LOGD("QueryAppGalleryAbilityName called");
8221     AbilityInfo abilityInfo;
8222     ExtensionAbilityInfo extensionInfo;
8223     Want want;
8224     want.SetAction(FREE_INSTALL_ACTION);
8225     if (!ImplicitQueryInfoByPriority(
8226         want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
8227         APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
8228         return false;
8229     }
8230     if (!abilityInfo.name.empty()) {
8231         bundleName = abilityInfo.bundleName;
8232         abilityName = abilityInfo.name;
8233     } else {
8234         bundleName = extensionInfo.bundleName;
8235         abilityName = extensionInfo.name;
8236     }
8237 
8238     if (bundleName.empty() || abilityName.empty()) {
8239         APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
8240             bundleName.c_str(), abilityName.c_str());
8241         return false;
8242     }
8243     bool isSystemApp = false;
8244     if (IsSystemApp(bundleName, isSystemApp) != ERR_OK || !isSystemApp) {
8245         APP_LOGW("%{public}s is not systemApp", bundleName.c_str());
8246         bundleName.clear();
8247         abilityName.clear();
8248         return false;
8249     }
8250     APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
8251         bundleName.c_str(), abilityName.c_str());
8252     return true;
8253 }
8254 
GetJsonProfile(ProfileType profileType,const std::string & bundleName,const std::string & moduleName,std::string & profile,int32_t userId) const8255 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
8256     const std::string &moduleName, std::string &profile, int32_t userId) const
8257 {
8258     APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
8259         profileType, bundleName.c_str(), moduleName.c_str());
8260     int32_t requestUserId = GetUserId(userId);
8261     if (requestUserId == Constants::INVALID_USERID) {
8262         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
8263     }
8264     auto mapItem = PROFILE_TYPE_MAP.find(profileType);
8265     if (mapItem == PROFILE_TYPE_MAP.end()) {
8266         APP_LOGE("profileType: %{public}d is invalid", profileType);
8267         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
8268     }
8269     std::string profilePath = mapItem->second;
8270     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8271     const auto &item = bundleInfos_.find(bundleName);
8272     if (item == bundleInfos_.end()) {
8273         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
8274         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8275     }
8276     const InnerBundleInfo &bundleInfo = item->second;
8277     bool isEnabled = false;
8278     int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
8279     ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
8280     if (res != ERR_OK) {
8281         APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
8282         return res;
8283     }
8284     if (!isEnabled) {
8285         APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
8286         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
8287     }
8288     std::string moduleNameTmp = moduleName;
8289     if (moduleName.empty()) {
8290         APP_LOGW("moduleName is empty, try to get profile from entry module");
8291         std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
8292         for (const auto &info : moduleInfos) {
8293             if (info.second.isEntry) {
8294                 moduleNameTmp = info.second.moduleName;
8295                 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
8296                 break;
8297             }
8298         }
8299     }
8300     auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
8301     if (!moduleInfo) {
8302         APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
8303         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
8304     }
8305     return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
8306 }
8307 
GetJsonProfileByExtractor(const std::string & hapPath,const std::string & profilePath,std::string & profile) const8308 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
8309     const std::string &profilePath, std::string &profile) const
8310 {
8311     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
8312     APP_LOGD("GetJsonProfileByExtractor with hapPath %{private}s and profilePath %{private}s",
8313         hapPath.c_str(), profilePath.c_str());
8314     BundleExtractor bundleExtractor(hapPath);
8315     if (!bundleExtractor.Init()) {
8316         APP_LOGE("bundle extractor init failed");
8317         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8318     }
8319     if (!bundleExtractor.HasEntry(profilePath)) {
8320         APP_LOGD("profile not exist");
8321         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
8322     }
8323     std::stringstream profileStream;
8324     if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
8325         APP_LOGE("extract profile failed");
8326         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
8327     }
8328     profile = profileStream.str();
8329     return ERR_OK;
8330 }
8331 
QueryDataGroupInfos(const std::string & bundleName,int32_t userId,std::vector<DataGroupInfo> & infos) const8332 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
8333     std::vector<DataGroupInfo> &infos) const
8334 {
8335     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8336     auto infoItem = bundleInfos_.find(bundleName);
8337     if (infoItem == bundleInfos_.end()) {
8338         APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
8339         return false;
8340     }
8341     auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
8342     for (const auto &item : dataGroupInfos) {
8343         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
8344             [userId](const DataGroupInfo &info) {
8345             return info.userId == userId;
8346         });
8347         if (dataGroupIter != std::end(item.second)) {
8348             infos.push_back(*dataGroupIter);
8349         }
8350     }
8351     return true;
8352 }
8353 
GetGroupDir(const std::string & dataGroupId,std::string & dir,int32_t userId) const8354 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
8355 {
8356     if (userId == Constants::UNSPECIFIED_USERID) {
8357         userId = AccountHelper::GetCurrentActiveUserId();
8358     }
8359     std::string uuid;
8360     if (BundlePermissionMgr::IsSystemApp() &&
8361         BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
8362         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8363         for (const auto &item : bundleInfos_) {
8364             const auto &dataGroupInfos = item.second.GetDataGroupInfos();
8365             auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
8366             if (dataGroupInfosIter == dataGroupInfos.end()) {
8367                 continue;
8368             }
8369             auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
8370                 std::end(dataGroupInfosIter->second),
8371                 [userId](const DataGroupInfo &info) { return info.userId == userId; });
8372             if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
8373                 uuid = dataInUserIter->uuid;
8374                 break;
8375             }
8376         }
8377     } else {
8378         int32_t callingUid = IPCSkeleton::GetCallingUid();
8379         InnerBundleInfo innerBundleInfo;
8380         if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8381             APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
8382             return false;
8383         }
8384         const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8385         auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
8386         if (dataGroupInfosIter == dataGroupInfos.end()) {
8387             APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
8388             return false;
8389         }
8390         auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
8391             [userId](const DataGroupInfo &info) {
8392             return info.userId == userId;
8393         });
8394         if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
8395             uuid = dataGroupIter->uuid;
8396         }
8397     }
8398     if (uuid.empty()) {
8399         APP_LOGW("get uuid by data group id failed");
8400         return false;
8401     }
8402     dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR + std::to_string(userId)
8403         + ServiceConstants::DATA_GROUP_PATH + uuid;
8404     APP_LOGD("groupDir: %{private}s", dir.c_str());
8405     return true;
8406 }
8407 
CreateNewDataGroupInfo(const std::string & groupId,const int32_t userId,const DataGroupInfo & oldDataGroupInfo,DataGroupInfo & newDataGroupInfo)8408 void BundleDataMgr::CreateNewDataGroupInfo(const std::string &groupId, const int32_t userId,
8409     const DataGroupInfo &oldDataGroupInfo, DataGroupInfo &newDataGroupInfo)
8410 {
8411     newDataGroupInfo.dataGroupId = groupId;
8412     newDataGroupInfo.userId = userId;
8413 
8414     newDataGroupInfo.uuid = oldDataGroupInfo.uuid;
8415     int32_t uniqueId = oldDataGroupInfo.uid - oldDataGroupInfo.userId * Constants::BASE_USER_RANGE -
8416         DATA_GROUP_UID_OFFSET;
8417     int32_t uid = uniqueId + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8418     newDataGroupInfo.uid = uid;
8419     newDataGroupInfo.gid = uid;
8420 }
8421 
ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo & innerBundleInfo)8422 void BundleDataMgr::ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo &innerBundleInfo)
8423 {
8424     auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8425     if (dataGroupInfos.empty()) {
8426         return;
8427     }
8428     for (int32_t userId : innerBundleInfo.GetUsers()) {
8429         for (const auto &dataItem : dataGroupInfos) {
8430             std::string groupId = dataItem.first;
8431             if (dataItem.second.empty()) {
8432                 APP_LOGW("id infos %{public}s empty in -n %{public}s", groupId.c_str(),
8433                     innerBundleInfo.GetBundleName().c_str());
8434                 continue;
8435             }
8436             DataGroupInfo dataGroupInfo;
8437             CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8438             innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
8439             // user path can not access, need create group dir when user unlocked
8440         }
8441     }
8442 }
8443 
GenerateDataGroupUuidAndUid(DataGroupInfo & dataGroupInfo,int32_t userId,std::unordered_set<int32_t> & uniqueIdSet) const8444 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
8445     std::unordered_set<int32_t> &uniqueIdSet) const
8446 {
8447     int32_t uniqueId = DATA_GROUP_INDEX_START;
8448     for (int32_t i = DATA_GROUP_INDEX_START; i < DATA_GROUP_UID_OFFSET; i++) {
8449         if (uniqueIdSet.find(i) == uniqueIdSet.end()) {
8450             uniqueId = i;
8451             break;
8452         }
8453     }
8454 
8455     int32_t uid = userId * Constants::BASE_USER_RANGE + uniqueId + DATA_GROUP_UID_OFFSET;
8456     dataGroupInfo.uid = uid;
8457     dataGroupInfo.gid = uid;
8458 
8459     std::string str = GenerateUuidByKey(dataGroupInfo.dataGroupId);
8460     dataGroupInfo.uuid = str;
8461     uniqueIdSet.insert(uniqueId);
8462 }
8463 
GenerateDataGroupInfos(const std::string & bundleName,const std::unordered_set<std::string> & dataGroupIdList,int32_t userId,bool needSaveStorage)8464 void BundleDataMgr::GenerateDataGroupInfos(const std::string &bundleName,
8465     const std::unordered_set<std::string> &dataGroupIdList, int32_t userId, bool needSaveStorage)
8466 {
8467     APP_LOGD("called for user: %{public}d", userId);
8468     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8469     auto bundleInfoItem = bundleInfos_.find(bundleName);
8470     if (bundleInfoItem == bundleInfos_.end()) {
8471         APP_LOGW("%{public}s not found", bundleName.c_str());
8472         return;
8473     }
8474     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8475     for (const auto &dataItem : dataGroupInfos) {
8476         std::string oldGroupId = dataItem.first;
8477         if (dataGroupIdList.find(oldGroupId) == dataGroupIdList.end()) {
8478             bundleInfoItem->second.DeleteDataGroupInfo(oldGroupId);
8479         }
8480     }
8481     if (dataGroupIdList.empty()) {
8482         APP_LOGD("dataGroupIdList is empty");
8483         return;
8484     }
8485     std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
8486     std::unordered_set<int32_t> uniqueIdSet;
8487     GetDataGroupIndexMap(dataGroupIndexMap, uniqueIdSet);
8488     for (const std::string &groupId : dataGroupIdList) {
8489         DataGroupInfo dataGroupInfo;
8490         dataGroupInfo.dataGroupId = groupId;
8491         dataGroupInfo.userId = userId;
8492         auto iter = dataGroupIndexMap.find(groupId);
8493         if (iter != dataGroupIndexMap.end()) {
8494             dataGroupInfo.uuid = iter->second.second;
8495             int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8496             dataGroupInfo.uid = uid;
8497             dataGroupInfo.gid = uid;
8498         } else {
8499             // need to generate a valid uniqueId
8500             GenerateDataGroupUuidAndUid(dataGroupInfo, userId, uniqueIdSet);
8501         }
8502         bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8503     }
8504     (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8505     ProcessAllUserDataGroupInfosWhenBundleUpdate(bundleInfoItem->second);
8506     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8507         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8508     }
8509 }
8510 
GenerateNewUserDataGroupInfos(const std::string & bundleName,int32_t userId)8511 void BundleDataMgr::GenerateNewUserDataGroupInfos(const std::string &bundleName, int32_t userId)
8512 {
8513     APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8514     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8515     auto bundleInfoItem = bundleInfos_.find(bundleName);
8516     if (bundleInfoItem == bundleInfos_.end()) {
8517         APP_LOGW("%{public}s not found", bundleName.c_str());
8518         return;
8519     }
8520     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8521     if (dataGroupInfos.empty()) {
8522         return;
8523     }
8524     for (const auto &dataItem : dataGroupInfos) {
8525         std::string groupId = dataItem.first;
8526         if (dataItem.second.empty()) {
8527             APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8528             continue;
8529         }
8530         DataGroupInfo dataGroupInfo;
8531         CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8532         bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8533         //need create group dir
8534         (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8535     }
8536     if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8537         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8538     }
8539 }
8540 
DeleteUserDataGroupInfos(const std::string & bundleName,int32_t userId,bool keepData)8541 void BundleDataMgr::DeleteUserDataGroupInfos(const std::string &bundleName, int32_t userId, bool keepData)
8542 {
8543     APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8544     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8545     auto bundleInfoItem = bundleInfos_.find(bundleName);
8546     if (bundleInfoItem == bundleInfos_.end()) {
8547         APP_LOGW("%{public}s not found", bundleName.c_str());
8548         return;
8549     }
8550     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8551     if (dataGroupInfos.empty()) {
8552         return;
8553     }
8554     std::vector<std::string> uuidList;
8555     for (const auto &dataItem : dataGroupInfos) {
8556         std::string groupId = dataItem.first;
8557         if (dataItem.second.empty()) {
8558             APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8559             continue;
8560         }
8561         bundleInfoItem->second.RemoveGroupInfos(userId, groupId);
8562         if (!keepData && !IsDataGroupIdExistNoLock(groupId, userId)) {
8563             uuidList.emplace_back(dataItem.second[0].uuid);
8564         }
8565     }
8566     auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8567     if (result != ERR_OK) {
8568         APP_LOGE("delete group dir failed, err %{public}d", result);
8569     }
8570     if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8571         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8572     }
8573 }
8574 
GetDataGroupIndexMap(std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap,std::unordered_set<int32_t> & uniqueIdSet) const8575 void BundleDataMgr::GetDataGroupIndexMap(std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap,
8576     std::unordered_set<int32_t> &uniqueIdSet) const
8577 {
8578     for (const auto &bundleInfo : bundleInfos_) {
8579         for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
8580             for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
8581                 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
8582                     - DATA_GROUP_UID_OFFSET;
8583                 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
8584                     std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
8585                 uniqueIdSet.insert(index);
8586             });
8587         }
8588     }
8589 }
8590 
IsShareDataGroupIdNoLock(const std::string & dataGroupId,int32_t userId) const8591 bool BundleDataMgr::IsShareDataGroupIdNoLock(const std::string &dataGroupId, int32_t userId) const
8592 {
8593     APP_LOGD("IsShareDataGroupIdNoLock, dataGroupId is %{public}s", dataGroupId.c_str());
8594     int32_t count = 0;
8595     for (const auto &info : bundleInfos_) {
8596         auto dataGroupInfos = info.second.GetDataGroupInfos();
8597         auto iter = dataGroupInfos.find(dataGroupId);
8598         if (iter == dataGroupInfos.end()) {
8599             continue;
8600         }
8601 
8602         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8603             [userId](const DataGroupInfo &dataGroupInfo) {
8604             return dataGroupInfo.userId == userId;
8605         });
8606         if (dataGroupIter == std::end(iter->second)) {
8607             continue;
8608         }
8609         count++;
8610         if (count > 1) {
8611             APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
8612             return true;
8613         }
8614     }
8615     return false;
8616 }
8617 
IsDataGroupIdExistNoLock(const std::string & dataGroupId,int32_t userId) const8618 bool BundleDataMgr::IsDataGroupIdExistNoLock(const std::string &dataGroupId, int32_t userId) const
8619 {
8620     APP_LOGD("dataGroupId is %{public}s, user %{public}d", dataGroupId.c_str(), userId);
8621     for (const auto &info : bundleInfos_) {
8622         auto dataGroupInfos = info.second.GetDataGroupInfos();
8623         auto iter = dataGroupInfos.find(dataGroupId);
8624         if (iter == dataGroupInfos.end()) {
8625             continue;
8626         }
8627 
8628         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8629             [userId](const DataGroupInfo &dataGroupInfo) {
8630             return dataGroupInfo.userId == userId;
8631         });
8632         if (dataGroupIter == std::end(iter->second)) {
8633             continue;
8634         }
8635         return true;
8636     }
8637     return false;
8638 }
8639 
DeleteGroupDirsForException(const InnerBundleInfo & oldInfo,int32_t userId) const8640 void BundleDataMgr::DeleteGroupDirsForException(const InnerBundleInfo &oldInfo, int32_t userId) const
8641 {
8642     //find ids existed in newInfo, but not in oldInfo when there is no others share this id
8643     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8644     const auto bundleInfoItem = bundleInfos_.find(oldInfo.GetBundleName());
8645     if (bundleInfoItem == bundleInfos_.end()) {
8646         APP_LOGE("find bundle %{public}s failed", oldInfo.GetBundleName().c_str());
8647         return;
8648     }
8649     auto newDataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8650     if (newDataGroupInfos.empty()) {
8651         return;
8652     }
8653     auto oldDatagroupInfos = oldInfo.GetDataGroupInfos();
8654     std::vector<std::string> uuidList;
8655     for (const auto &newDataItem : newDataGroupInfos) {
8656         std::string newGroupId = newDataItem.first;
8657         if (newDataItem.second.empty()) {
8658             APP_LOGE("infos empty in %{public}s %{public}s", oldInfo.GetBundleName().c_str(), newGroupId.c_str());
8659             continue;
8660         }
8661         if (oldDatagroupInfos.find(newGroupId) != oldDatagroupInfos.end() ||
8662             IsShareDataGroupIdNoLock(newGroupId, userId)) {
8663             continue;
8664         }
8665         uuidList.emplace_back(newDataItem.second[0].uuid);
8666     }
8667     auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8668     if (result != ERR_OK) {
8669         APP_LOGE("delete group dir failed, err %{public}d", result);
8670     }
8671 }
8672 
FindAbilityInfoInBundleInfo(const InnerBundleInfo & innerBundleInfo,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo) const8673 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
8674     const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
8675 {
8676     if (moduleName.empty()) {
8677         auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8678         if (!ability) {
8679             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8680         }
8681         abilityInfo = *ability;
8682         return ERR_OK;
8683     }
8684 
8685     ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
8686     if (ret != ERR_OK) {
8687         APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
8688     }
8689     return ret;
8690 }
8691 
HasAppOrAtomicServiceInUser(const std::string & bundleName,int32_t userId) const8692 bool BundleDataMgr::HasAppOrAtomicServiceInUser(const std::string &bundleName, int32_t userId) const
8693 {
8694     if (!HasUserId(userId)) {
8695         APP_LOGW("user %{public}d error", userId);
8696         return false;
8697     }
8698     if (bundleName.empty()) {
8699         APP_LOGW("param -n %{public}s error", bundleName.c_str());
8700         return false;
8701     }
8702     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8703     auto iter = bundleInfos_.find(bundleName);
8704     if (iter == bundleInfos_.end()) {
8705         APP_LOGW("bundle %{public}s not found", bundleName.c_str());
8706         return false;
8707     }
8708     BundleType bundleType = iter->second.GetApplicationBundleType();
8709     if (bundleType != BundleType::APP && bundleType != BundleType::ATOMIC_SERVICE) {
8710         APP_LOGW("bundle %{public}s is not app or atomicservice", bundleName.c_str());
8711         return false;
8712     }
8713     return iter->second.GetResponseUserId(userId) != Constants::INVALID_USERID;
8714 }
8715 
GetAllAppAndAtomicServiceInUser(int32_t userId,std::vector<std::string> & bundleList) const8716 bool BundleDataMgr::GetAllAppAndAtomicServiceInUser(int32_t userId, std::vector<std::string> &bundleList) const
8717 {
8718     if (!HasUserId(userId)) {
8719         APP_LOGW("param -u %{public}d error", userId);
8720         return false;
8721     }
8722     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8723     for (const auto &item : bundleInfos_) {
8724         BundleType bundleType = item.second.GetApplicationBundleType();
8725         if (bundleType != BundleType::APP && bundleType != BundleType::ATOMIC_SERVICE) {
8726             continue;
8727         }
8728         if (item.second.GetResponseUserId(userId) != Constants::INVALID_USERID) {
8729             bundleList.emplace_back(item.first);
8730         }
8731     }
8732     return !bundleList.empty();
8733 }
8734 
ScanAllBundleGroupInfo()8735 void BundleDataMgr::ScanAllBundleGroupInfo()
8736 {
8737     // valid info, key: index, value: dataGroupId
8738     std::map<int32_t, std::string> indexMap;
8739     // valid info, key: dataGroupId, value: index
8740     std::map<std::string, int32_t> groupIdMap;
8741     // invalid infos, key: bundleNames, value: dataGroupId
8742     std::map<std::string, std::set<std::string>> needProcessGroupInfoBundleNames;
8743     // invalid GroupId
8744     std::set<std::string> errorGroupIds;
8745     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
8746     for (const auto &info : bundleInfos_) {
8747         std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos = info.second.GetDataGroupInfos();
8748         if (dataGroupInfos.empty()) {
8749             continue;
8750         }
8751         for (const auto &dataGroupItem : dataGroupInfos) {
8752             std::string dataGroupId = dataGroupItem.first;
8753             if (dataGroupItem.second.empty()) {
8754                 APP_LOGW("dataGroupInfos is empty in %{public}s", dataGroupId.c_str());
8755                 continue;
8756             }
8757             int32_t groupUidIndex = dataGroupItem.second[0].uid -
8758                 dataGroupItem.second[0].userId * Constants::BASE_USER_RANGE - DATA_GROUP_UID_OFFSET;
8759             bool hasIndex = indexMap.find(groupUidIndex) != indexMap.end();
8760             if (!hasIndex && groupIdMap.find(dataGroupId) == groupIdMap.end()) {
8761                 indexMap[groupUidIndex] = dataGroupId;
8762                 groupIdMap[dataGroupId] = groupUidIndex;
8763                 continue;
8764             }
8765             if (!hasIndex && groupIdMap.find(dataGroupId) != groupIdMap.end()) {
8766                 APP_LOGW("id %{public}s has invalid index %{public}d, not index %{public}d",
8767                     dataGroupId.c_str(), groupIdMap[dataGroupId], groupUidIndex);
8768             }
8769             if (hasIndex && indexMap[groupUidIndex] == dataGroupId) {
8770                 continue;
8771             }
8772             if (hasIndex && indexMap[groupUidIndex] != dataGroupId) {
8773                 APP_LOGW("id %{public}s has invalid index %{public}d", dataGroupId.c_str(), groupUidIndex);
8774             }
8775             errorGroupIds.insert(dataGroupId);
8776             // invalid index or groupId
8777             APP_LOGW("error index %{public}d groudId %{public}s -n %{public}s",
8778                 groupUidIndex, dataGroupId.c_str(), info.first.c_str());
8779             needProcessGroupInfoBundleNames[info.first].insert(dataGroupId);
8780         }
8781     }
8782     HandleGroupIdAndIndex(errorGroupIds, indexMap, groupIdMap);
8783     if (!HandleErrorDataGroupInfos(groupIdMap, needProcessGroupInfoBundleNames)) {
8784         APP_LOGE("process bundle data group failed");
8785     }
8786 }
8787 
HandleGroupIdAndIndex(const std::set<std::string> errorGroupIds,std::map<int32_t,std::string> & indexMap,std::map<std::string,int32_t> & groupIdMap)8788 void BundleDataMgr::HandleGroupIdAndIndex(
8789     const std::set<std::string> errorGroupIds,
8790     std::map<int32_t, std::string> &indexMap,
8791     std::map<std::string, int32_t> &groupIdMap)
8792 {
8793     if (errorGroupIds.empty() || indexMap.empty() || groupIdMap.empty()) {
8794         return;
8795     }
8796     for (const auto &groupId : errorGroupIds) {
8797         if (groupIdMap.find(groupId) != groupIdMap.end()) {
8798             continue;
8799         }
8800         int32_t groupIndex = DATA_GROUP_INDEX_START;
8801         for (int32_t index = DATA_GROUP_INDEX_START; index < DATA_GROUP_UID_OFFSET; ++index) {
8802             if (indexMap.find(index) == indexMap.end()) {
8803                 groupIndex = index;
8804                 break;
8805             }
8806         }
8807         groupIdMap[groupId] = groupIndex;
8808         indexMap[groupIndex] = groupId;
8809     }
8810 }
8811 
HandleErrorDataGroupInfos(const std::map<std::string,int32_t> & groupIdMap,const std::map<std::string,std::set<std::string>> & needProcessGroupInfoBundleNames)8812 bool BundleDataMgr::HandleErrorDataGroupInfos(
8813     const std::map<std::string, int32_t> &groupIdMap,
8814     const std::map<std::string, std::set<std::string>> &needProcessGroupInfoBundleNames)
8815 {
8816     if (groupIdMap.empty() || needProcessGroupInfoBundleNames.empty()) {
8817         return true;
8818     }
8819     bool ret = true;
8820     for (const auto &item : needProcessGroupInfoBundleNames) {
8821         auto bundleInfoIter = bundleInfos_.find(item.first);
8822         if (bundleInfoIter == bundleInfos_.end()) {
8823             ret = false;
8824             continue;
8825         }
8826         std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos =
8827             bundleInfoIter->second.GetDataGroupInfos();
8828         if (dataGroupInfos.empty()) {
8829             continue;
8830         }
8831         auto userIds = bundleInfoIter->second.GetUsers();
8832         for (const auto &groudId : item.second) {
8833             auto groupIndexIter = groupIdMap.find(groudId);
8834             if (groupIndexIter == groupIdMap.end()) {
8835                 APP_LOGW("id map not found group %{public}s", groudId.c_str());
8836                 ret = false;
8837                 continue;
8838             }
8839             auto dataGroupInfoIter = dataGroupInfos.find(groudId);
8840             if ((dataGroupInfoIter == dataGroupInfos.end()) || dataGroupInfoIter->second.empty()) {
8841                 continue;
8842             }
8843             for (int32_t userId : userIds) {
8844                 DataGroupInfo dataGroupInfo;
8845                 dataGroupInfo.dataGroupId = groudId;
8846                 dataGroupInfo.userId = userId;
8847                 dataGroupInfo.uuid = dataGroupInfoIter->second[0].uuid;
8848                 int32_t uid = userId * Constants::BASE_USER_RANGE + groupIndexIter->second + DATA_GROUP_UID_OFFSET;
8849                 dataGroupInfo.uid = uid;
8850                 dataGroupInfo.gid = uid;
8851                 bundleInfoIter->second.AddDataGroupInfo(groudId, dataGroupInfo);
8852             }
8853         }
8854         if (!dataStorage_->SaveStorageBundleInfo(bundleInfoIter->second)) {
8855             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", item.first.c_str());
8856             ret = false;
8857         }
8858     }
8859     return ret;
8860 }
8861 
8862 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)8863 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
8864 {
8865     InnerBundleInfo targetInnerBundleInfo;
8866     std::string targetBundleName = newInfo.GetTargetBundleName();
8867     auto targetInfoItem = bundleInfos_.find(targetBundleName);
8868     if (targetInfoItem != bundleInfos_.end()) {
8869         targetInnerBundleInfo = targetInfoItem->second;
8870     }
8871 
8872     if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
8873         APP_LOGW("update overlay info failed");
8874         return false;
8875     }
8876     // storage target bundle info
8877     if (!targetInnerBundleInfo.GetBundleName().empty() &&
8878         dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8879         bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
8880     }
8881     // build overlay connection for external overlay
8882     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8883         const auto &moduleInfos = newInfo.GetInnerModuleInfos();
8884         std::string moduleName = (moduleInfos.begin()->second).moduleName;
8885         BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
8886     }
8887     return true;
8888 }
8889 
ResetExternalOverlayModuleState(const std::string & bundleName,const std::string & modulePackage)8890 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
8891 {
8892     for (auto &info : bundleInfos_) {
8893         if (info.second.GetTargetBundleName() != bundleName) {
8894             continue;
8895         }
8896         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8897         for (const auto &moduleInfo : innerModuleInfos) {
8898             if (moduleInfo.second.targetModuleName == modulePackage) {
8899                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8900                 break;
8901             }
8902         }
8903         if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
8904             APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
8905         }
8906     }
8907 }
8908 
BuildExternalOverlayConnection(const std::string & moduleName,InnerBundleInfo & oldInfo,int32_t userId)8909 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
8910     int32_t userId)
8911 {
8912     APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
8913         moduleName.c_str(), userId);
8914     for (auto &info : bundleInfos_) {
8915         if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
8916             continue;
8917         }
8918         // check target bundle is preInstall application
8919         if (!oldInfo.IsPreInstallApp()) {
8920             APP_LOGW("target bundle is not preInstall application");
8921             return;
8922         }
8923 
8924         // check fingerprint of current bundle with target bundle
8925         if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
8926             APP_LOGW("target bundle has different fingerprint with current bundle");
8927             return;
8928         }
8929         // external overlay does not support FA model
8930         if (!oldInfo.GetIsNewVersion()) {
8931             APP_LOGW("target bundle is not stage model");
8932             return;
8933         }
8934         // external overlay does not support service
8935         if (oldInfo.GetEntryInstallationFree()) {
8936             APP_LOGW("target bundle is service");
8937             return;
8938         }
8939 
8940         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8941         std::vector<std::string> overlayModuleVec;
8942         for (const auto &moduleInfo : innerModuleInfos) {
8943             if (moduleInfo.second.targetModuleName != moduleName) {
8944                 continue;
8945             }
8946             OverlayModuleInfo overlayModuleInfo;
8947             overlayModuleInfo.bundleName = info.second.GetBundleName();
8948             overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
8949             overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
8950             overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
8951             overlayModuleInfo.priority = moduleInfo.second.targetPriority;
8952             oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
8953             overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
8954         }
8955         std::string bundleDir;
8956         const std::string &moduleHapPath =
8957             info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
8958         OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
8959         OverlayBundleInfo overlayBundleInfo;
8960         overlayBundleInfo.bundleName = info.second.GetBundleName();
8961         overlayBundleInfo.bundleDir = bundleDir;
8962         overlayBundleInfo.state = info.second.GetOverlayState();
8963         overlayBundleInfo.priority = info.second.GetTargetPriority();
8964         oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
8965         auto userSet = GetAllUser();
8966         for (const auto &innerUserId : userSet) {
8967             for (const auto &overlayModule : overlayModuleVec) {
8968                 int32_t state = OverlayState::OVERLAY_INVALID;
8969                 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
8970                 if (state == OverlayState::OVERLAY_INVALID) {
8971                     info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
8972                 }
8973             }
8974         }
8975     }
8976 }
8977 
RemoveOverlayInfoAndConnection(const InnerBundleInfo & innerBundleInfo,const std::string & bundleName)8978 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
8979     const std::string &bundleName)
8980 {
8981     if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
8982         std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
8983         auto targetInfoItem = bundleInfos_.find(targetBundleName);
8984         if (targetInfoItem == bundleInfos_.end()) {
8985             APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
8986         } else {
8987             InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
8988             OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
8989             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8990                 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
8991                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
8992             }
8993         }
8994     }
8995 
8996     if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8997         for (auto &info : bundleInfos_) {
8998             if (info.second.GetTargetBundleName() != bundleName) {
8999                 continue;
9000             }
9001             const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
9002             for (const auto &moduleInfo : innerModuleInfos) {
9003                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
9004             }
9005             dataStorage_->SaveStorageBundleInfo(info.second);
9006         }
9007     }
9008 }
9009 #endif
9010 
GetOldAppIds(const std::string & bundleName,std::vector<std::string> & appIds) const9011 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
9012 {
9013     if (bundleName.empty()) {
9014         APP_LOGE("bundleName is empty");
9015         return false;
9016     }
9017     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9018     auto innerBundleInfo = bundleInfos_.find(bundleName);
9019     if (innerBundleInfo == bundleInfos_.end()) {
9020         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
9021         return false;
9022     }
9023     appIds = innerBundleInfo->second.GetOldAppIds();
9024     return true;
9025 }
9026 
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo & oldInfo,const InnerBundleInfo & newInfo) const9027 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
9028     const InnerBundleInfo &newInfo) const
9029 {
9030     return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
9031         !oldInfo.HasEntry() || newInfo.HasEntry() ||
9032         (oldInfo.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE &&
9033         oldInfo.GetVersionCode() < newInfo.GetVersionCode());
9034 }
9035 
GetModuleNameByBundleAndAbility(const std::string & bundleName,const std::string & abilityName)9036 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
9037     const std::string& bundleName, const std::string& abilityName)
9038 {
9039     if (bundleName.empty() || abilityName.empty()) {
9040         APP_LOGE("bundleName or abilityName is empty");
9041         return std::string();
9042     }
9043     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9044     auto innerBundleInfo = bundleInfos_.find(bundleName);
9045     if (innerBundleInfo == bundleInfos_.end()) {
9046         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
9047         return std::string();
9048     }
9049     auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
9050     if (!abilityInfo) {
9051         APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
9052             bundleName.c_str(), abilityName.c_str());
9053         return std::string();
9054     }
9055     return abilityInfo->moduleName;
9056 }
9057 
SetAdditionalInfo(const std::string & bundleName,const std::string & additionalInfo) const9058 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
9059 {
9060     APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
9061     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9062     auto infoItem = bundleInfos_.find(bundleName);
9063     if (infoItem == bundleInfos_.end()) {
9064         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9065         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9066     }
9067 
9068     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
9069         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
9070         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
9071         if (responseUserId == Constants::INVALID_USERID) {
9072             APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
9073             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9074         }
9075     }
9076 
9077     auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
9078     if (appProvisionInfoManager == nullptr) {
9079         APP_LOGE("Failed, appProvisionInfoManager is nullptr");
9080         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9081     }
9082 
9083     if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
9084         APP_LOGE("BundleName: %{public}s set additional info failed", bundleName.c_str());
9085         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9086     }
9087 
9088     ElementName element;
9089     element.SetBundleName(bundleName);
9090     OHOS::AAFwk::Want want;
9091     want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
9092     want.SetElement(element);
9093     EventFwk::CommonEventData commonData { want };
9094     NotifyBundleEventCallback(commonData);
9095     return ERR_OK;
9096 }
9097 
GetAppServiceHspBundleInfo(const std::string & bundleName,BundleInfo & bundleInfo)9098 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
9099 {
9100     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
9101     if (bundleName.empty()) {
9102         APP_LOGE("bundleName is empty");
9103         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
9104     }
9105 
9106     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9107     auto infoItem = bundleInfos_.find(bundleName);
9108     if (infoItem == bundleInfos_.end()) {
9109         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
9110         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9111     }
9112     const InnerBundleInfo &innerBundleInfo = infoItem->second;
9113     auto res = innerBundleInfo.GetAppServiceHspInfo(bundleInfo);
9114     if (res != ERR_OK) {
9115         APP_LOGW("get hspInfo %{public}s fail", bundleName.c_str());
9116         return res;
9117     }
9118     return ERR_OK;
9119 }
9120 
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo & innerBundleInfo,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos) const9121 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
9122     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
9123 {
9124     APP_LOGD("start");
9125     BundleInfo bundleInfo;
9126     if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
9127         APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
9128         for (const auto &hapModule : bundleInfo.hapModuleInfos) {
9129             BaseSharedBundleInfo baseSharedBundleInfo;
9130             baseSharedBundleInfo.bundleName = bundleInfo.name;
9131             baseSharedBundleInfo.moduleName = hapModule.moduleName;
9132             baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
9133             baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
9134             baseSharedBundleInfo.hapPath = hapModule.hapPath;
9135             baseSharedBundleInfo.moduleArkTSMode = hapModule.moduleArkTSMode;
9136             baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
9137             baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
9138             baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
9139         }
9140         return;
9141     }
9142     APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
9143 }
9144 
AddAppHspBundleName(const BundleType type,const std::string & bundleName)9145 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
9146 {
9147     if (type == BundleType::APP_SERVICE_FWK) {
9148         APP_LOGD("add app hsp bundleName:%{public}s", bundleName.c_str());
9149         std::lock_guard<ffrt::mutex> hspLock(hspBundleNameMutex_);
9150         appServiceHspBundleName_.insert(bundleName);
9151     }
9152 }
9153 
CreateBundleDataDir(int32_t userId)9154 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId)
9155 {
9156     APP_LOGI("with -u %{public}d begin", userId);
9157     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9158     std::vector<CreateDirParam> createDirParams;
9159     std::vector<CreateDirParam> el5Params;
9160     for (const auto &item : bundleInfos_) {
9161         const InnerBundleInfo &info = item.second;
9162         int32_t responseUserId = info.GetResponseUserId(userId);
9163         if (responseUserId == Constants::INVALID_USERID) {
9164             APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
9165                 info.GetBundleName().c_str(), userId);
9166             continue;
9167         }
9168         CreateDirParam createDirParam;
9169         createDirParam.bundleName = info.GetBundleName();
9170         createDirParam.userId = responseUserId;
9171         createDirParam.uid = info.GetUid(responseUserId);
9172         createDirParam.gid = info.GetGid(responseUserId);
9173         createDirParam.apl = info.GetAppPrivilegeLevel();
9174         createDirParam.isPreInstallApp = info.IsPreInstallApp();
9175         createDirParam.debug = info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
9176         createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
9177         createDirParam.extensionDirs = info.GetAllExtensionDirs();
9178         createDirParams.emplace_back(createDirParam);
9179 
9180         std::vector<RequestPermission> reqPermissions = info.GetAllRequestPermissions();
9181         auto it = std::find_if(reqPermissions.begin(), reqPermissions.end(), [](const RequestPermission& permission) {
9182             return permission.name == ServiceConstants::PERMISSION_PROTECT_SCREEN_LOCK_DATA;
9183         });
9184         if (it != reqPermissions.end()) {
9185             el5Params.emplace_back(createDirParam);
9186         }
9187         CreateAppGroupDir(info, responseUserId);
9188     }
9189     lock.unlock();
9190     APP_LOGI("begin create dirs");
9191     auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
9192     APP_LOGI("end, res %{public}d", res);
9193     CreateEl5Dir(el5Params, true);
9194     return res;
9195 }
9196 
CreateBundleDataDirWithEl(int32_t userId,DataDirEl dirEl)9197 ErrCode BundleDataMgr::CreateBundleDataDirWithEl(int32_t userId, DataDirEl dirEl)
9198 {
9199     APP_LOGI("with -u %{public}d -el %{public}d begin", userId, static_cast<uint8_t>(dirEl));
9200     std::vector<CreateDirParam> createDirParams;
9201     {
9202         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9203         for (const auto &item : bundleInfos_) {
9204             const InnerBundleInfo &info = item.second;
9205             if (!info.HasInnerBundleUserInfo(userId)) {
9206                 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
9207                     info.GetBundleName().c_str(), userId);
9208                 continue;
9209             }
9210             if (dirEl == DataDirEl::EL5 && !info.NeedCreateEl5Dir()) {
9211                 continue;
9212             }
9213             CreateDirParam createDirParam;
9214             createDirParam.bundleName = info.GetBundleName();
9215             createDirParam.userId = userId;
9216             createDirParam.uid = info.GetUid(userId);
9217             createDirParam.gid = info.GetGid(userId);
9218             createDirParam.apl = info.GetAppPrivilegeLevel();
9219             createDirParam.isPreInstallApp = info.IsPreInstallApp();
9220             createDirParam.debug =
9221                 info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
9222             createDirParam.extensionDirs = info.GetAllExtensionDirs();
9223             createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
9224             createDirParam.dataDirEl = dirEl;
9225             createDirParams.emplace_back(createDirParam);
9226             CreateAppGroupDir(info, userId);
9227         }
9228     }
9229     ErrCode res = ERR_OK;
9230     if (dirEl != DataDirEl::EL5) {
9231         res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
9232     } else {
9233         CreateEl5Dir(createDirParams, true);
9234     }
9235     APP_LOGI("with -u %{public}d -el %{public}d end", userId, static_cast<uint8_t>(dirEl));
9236     return res;
9237 }
9238 
CreateEl5Dir(const std::vector<CreateDirParam> & el5Params,bool needSaveStorage)9239 void BundleDataMgr::CreateEl5Dir(const std::vector<CreateDirParam> &el5Params, bool needSaveStorage)
9240 {
9241     for (const auto &el5Param : el5Params) {
9242         APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
9243             el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
9244         InnerCreateEl5Dir(el5Param);
9245         SetEl5DirPolicy(el5Param, needSaveStorage);
9246     }
9247 }
9248 
CreateEl5DirNoCache(const std::vector<CreateDirParam> & el5Params,InnerBundleInfo & info)9249 void BundleDataMgr::CreateEl5DirNoCache(const std::vector<CreateDirParam> &el5Params, InnerBundleInfo &info)
9250 {
9251     for (const auto &el5Param : el5Params) {
9252         APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
9253             el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
9254         InnerCreateEl5Dir(el5Param);
9255         std::string keyId = "";
9256         SetEl5DirPolicy(el5Param, info, keyId);
9257         info.SetkeyId(el5Param.userId, keyId, el5Param.appIndex);
9258     }
9259 }
9260 
GetUidByBundleName(const std::string & bundleName,int32_t userId,int32_t appIndex) const9261 int32_t BundleDataMgr::GetUidByBundleName(const std::string &bundleName, int32_t userId, int32_t appIndex) const
9262 {
9263     if (bundleName.empty()) {
9264         APP_LOGW("bundleName is empty");
9265         return Constants::INVALID_UID;
9266     }
9267 
9268     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9269     auto infoItem = bundleInfos_.find(bundleName);
9270     if (infoItem == bundleInfos_.end()) {
9271         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
9272         return Constants::INVALID_UID;
9273     }
9274     const InnerBundleInfo &innerBundleInfo = infoItem->second;
9275     if (userId == Constants::UNSPECIFIED_USERID) {
9276         userId = GetUserIdByCallingUid();
9277     }
9278     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9279     return innerBundleInfo.GetUid(responseUserId, appIndex);
9280 }
9281 
InnerCreateEl5Dir(const CreateDirParam & el5Param)9282 void BundleDataMgr::InnerCreateEl5Dir(const CreateDirParam &el5Param)
9283 {
9284     std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
9285         ServiceConstants::PATH_SEPARATOR + std::to_string(el5Param.userId);
9286     if (!BundleUtil::IsExistDir(parentDir)) {
9287         APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
9288         return;
9289     }
9290     std::vector<std::string> dirs;
9291     std::string bundleNameDir = el5Param.bundleName;
9292     if (el5Param.appIndex > 0) {
9293         bundleNameDir = BundleCloneCommonHelper::GetCloneDataDir(el5Param.bundleName, el5Param.appIndex);
9294     }
9295     dirs.emplace_back(parentDir + ServiceConstants::BASE + bundleNameDir);
9296     dirs.emplace_back(parentDir + ServiceConstants::DATABASE + bundleNameDir);
9297     for (const std::string &dir : dirs) {
9298         uint32_t mode = S_IRWXU;
9299         int32_t gid = el5Param.uid;
9300         if (dir.find(ServiceConstants::DATABASE) != std::string::npos) {
9301             mode = S_IRWXU | S_IRWXG | S_ISGID;
9302             gid = ServiceConstants::DATABASE_DIR_GID;
9303         }
9304         if (InstalldClient::GetInstance()->Mkdir(dir, mode, el5Param.uid, gid) != ERR_OK) {
9305             LOG_W(BMS_TAG_INSTALLER, "create el5 dir %{public}s failed", dir.c_str());
9306         }
9307         ErrCode result = InstalldClient::GetInstance()->SetDirApl(
9308             dir, el5Param.bundleName, el5Param.apl, el5Param.isPreInstallApp, el5Param.debug, el5Param.uid);
9309         if (result != ERR_OK) {
9310             LOG_W(BMS_TAG_INSTALLER, "fail to SetDirApl dir %{public}s, error is %{public}d", dir.c_str(), result);
9311         }
9312     }
9313 }
9314 
SetEl5DirPolicy(const CreateDirParam & el5Param,bool needSaveStorage)9315 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, bool needSaveStorage)
9316 {
9317     InnerBundleInfo info;
9318     if (!FetchInnerBundleInfo(el5Param.bundleName, info)) {
9319         LOG_E(BMS_TAG_INSTALLER, "get bundle %{public}s failed", el5Param.bundleName.c_str());
9320         return;
9321     }
9322     std::string keyId = "";
9323     SetEl5DirPolicy(el5Param, info, keyId);
9324     if (!UpdateEl5KeyId(el5Param, keyId, needSaveStorage)) {
9325         LOG_E(BMS_TAG_INSTALLER, "save keyId failed");
9326     }
9327 }
9328 
SetEl5DirPolicy(const CreateDirParam & el5Param,InnerBundleInfo & info,std::string & keyId)9329 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, InnerBundleInfo &info, std::string &keyId)
9330 {
9331     int32_t uid = el5Param.uid;
9332     std::string bundleName = info.GetBundleName();
9333     if (el5Param.appIndex > 0) {
9334         bundleName = BundleCloneCommonHelper::GetCloneDataDir(bundleName, el5Param.appIndex);
9335     }
9336     EncryptionParam encryptionParam(bundleName, "", uid, el5Param.userId, EncryptionDirType::APP);
9337     auto result = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
9338     if (result != ERR_OK) {
9339         LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
9340     }
9341     LOG_D(BMS_TAG_INSTALLER, "%{public}s, keyId: %{public}s", bundleName.c_str(), keyId.c_str());
9342 }
9343 
CanOpenLink(const std::string & link,bool & canOpen) const9344 ErrCode BundleDataMgr::CanOpenLink(
9345     const std::string &link, bool &canOpen) const
9346 {
9347     APP_LOGI("link: %{public}s", link.c_str());
9348     auto uid = IPCSkeleton::GetCallingUid();
9349     InnerBundleInfo innerBundleInfo;
9350     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
9351         APP_LOGE("get innerBundleInfo by uid :%{public}d failed", uid);
9352         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9353     }
9354     auto querySchemes = innerBundleInfo.GetQuerySchemes();
9355     if (querySchemes.empty()) {
9356         APP_LOGI("querySchemes is empty");
9357         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9358     }
9359 
9360     size_t pos = link.find(SCHEME_END);
9361     if (pos == std::string::npos) {
9362         APP_LOGE("parse link : %{public}s failed", link.c_str());
9363         return ERR_BUNDLE_MANAGER_INVALID_SCHEME;
9364     }
9365     std::string scheme = link.substr(0, pos);
9366     transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
9367     if (std::find(querySchemes.begin(), querySchemes.end(), scheme) == querySchemes.end()) {
9368         APP_LOGI("scheme :%{public}s is not in the querySchemes", scheme.c_str());
9369         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9370     }
9371 
9372     Want want;
9373     want.SetUri(link);
9374     std::vector<AbilityInfo> abilityInfos;
9375     // implicit query
9376     ErrCode ret = ImplicitQueryAbilityInfosV9(
9377         want, static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), GetUserIdByUid(uid), abilityInfos);
9378     if (ret != ERR_OK) {
9379         APP_LOGD("implicit queryAbilityInfosV9 error");
9380         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
9381     }
9382 
9383     canOpen = !abilityInfos.empty();
9384     APP_LOGI("canOpen : %{public}d", canOpen);
9385     return ERR_OK;
9386 }
9387 
GenerateOdid(const std::string & developerId,std::string & odid) const9388 void BundleDataMgr::GenerateOdid(const std::string &developerId, std::string &odid) const
9389 {
9390     APP_LOGD("start, developerId:%{public}s", developerId.c_str());
9391     if (developerId.empty()) {
9392         APP_LOGE("developerId is empty");
9393         return;
9394     }
9395     std::string groupId = BundleUtil::ExtractGroupIdByDevelopId(developerId);
9396     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9397     for (const auto &item : bundleInfos_) {
9398         std::string developerIdExist;
9399         std::string odidExist;
9400         item.second.GetDeveloperidAndOdid(developerIdExist, odidExist);
9401         std::string groupIdExist = BundleUtil::ExtractGroupIdByDevelopId(developerIdExist);
9402         if (groupId == groupIdExist) {
9403             odid = odidExist;
9404             return;
9405         }
9406     }
9407     odid = GenerateUuid();
9408     APP_LOGI_NOFUNC("developerId:%{public}s not existed generate odid %{private}s",
9409         developerId.c_str(), odid.c_str());
9410 }
9411 
GetOdid(std::string & odid) const9412 ErrCode BundleDataMgr::GetOdid(std::string &odid) const
9413 {
9414     int32_t callingUid = IPCSkeleton::GetCallingUid();
9415     InnerBundleInfo innerBundleInfo;
9416     if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
9417         if (sandboxAppHelper_ == nullptr) {
9418             APP_LOGE("sandboxAppHelper_ is nullptr");
9419             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9420         }
9421         if (sandboxAppHelper_->GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
9422             APP_LOGW("app that corresponds to the callingUid %{public}d could not be found", callingUid);
9423             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9424         }
9425     }
9426     std::string developerId;
9427     innerBundleInfo.GetDeveloperidAndOdid(developerId, odid);
9428     return ERR_OK;
9429 }
9430 
GetOdidByBundleName(const std::string & bundleName,std::string & odid) const9431 ErrCode BundleDataMgr::GetOdidByBundleName(const std::string &bundleName, std::string &odid) const
9432 {
9433     APP_LOGI_NOFUNC("start GetOdidByBundleName -n %{public}s", bundleName.c_str());
9434     InnerBundleInfo innerBundleInfo;
9435     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9436     const auto &item = bundleInfos_.find(bundleName);
9437     if (item == bundleInfos_.end()) {
9438         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
9439         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9440     }
9441     const InnerBundleInfo &bundleInfo = item->second;
9442     bundleInfo.GetOdid(odid);
9443     return ERR_OK;
9444 }
9445 
HandleOTACodeEncryption()9446 void BundleDataMgr::HandleOTACodeEncryption()
9447 {
9448     int32_t timerId =
9449         XCollieHelper::SetRecoveryTimer(FUNCATION_HANDLE_OTA_CODE_ENCRYPTION, OTA_CODE_ENCRYPTION_TIMEOUT);
9450     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
9451     APP_LOGI("begin");
9452     std::vector<std::string> withoutKeyBundles;
9453     std::vector<std::string> withKeyBundles;
9454     {
9455         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9456         for (const auto &item : bundleInfos_) {
9457             item.second.HandleOTACodeEncryption(withoutKeyBundles, withKeyBundles);
9458         }
9459     }
9460     for (const std::string &bundleName : withKeyBundles) {
9461         UpdateAppEncryptedStatus(bundleName, true, 0, true);
9462     }
9463     for (const std::string &bundleName : withoutKeyBundles) {
9464         UpdateAppEncryptedStatus(bundleName, false, 0, true);
9465     }
9466     APP_LOGI("end");
9467 }
9468 
ProcessAllowedAcls(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo) const9469 void BundleDataMgr::ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const
9470 {
9471     if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
9472         oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
9473         return;
9474     }
9475     oldInfo.AddAllowedAcls(newInfo.GetAllowedAcls());
9476 }
9477 
GetAllBundleInfoByDeveloperId(const std::string & developerId,std::vector<BundleInfo> & bundleInfos,int32_t userId)9478 ErrCode BundleDataMgr::GetAllBundleInfoByDeveloperId(const std::string &developerId,
9479     std::vector<BundleInfo> &bundleInfos, int32_t userId)
9480 {
9481     int32_t requestUserId = GetUserId(userId);
9482     APP_LOGI("requestUserId: %{public}d", requestUserId);
9483     if (requestUserId == Constants::INVALID_USERID) {
9484         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9485     }
9486 
9487     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9488     if (bundleInfos_.empty()) {
9489         APP_LOGW("bundleInfos_ data is empty");
9490         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9491     }
9492     for (const auto &item : bundleInfos_) {
9493         const InnerBundleInfo &innerBundleInfo = item.second;
9494         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9495             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9496             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9497                 innerBundleInfo.GetBundleName().c_str());
9498             continue;
9499         }
9500 
9501         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9502         auto flag = GET_BASIC_APPLICATION_INFO;
9503         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9504             continue;
9505         }
9506         // check developerId
9507         std::string developerIdExist;
9508         std::string odidExist;
9509         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9510         if (developerIdExist != developerId) {
9511             continue;
9512         }
9513 
9514         BundleInfo bundleInfo;
9515 
9516         if (innerBundleInfo.GetBundleInfoV9(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION),
9517             bundleInfo, responseUserId) != ERR_OK) {
9518             continue;
9519         }
9520         bundleInfos.emplace_back(bundleInfo);
9521     }
9522     if (bundleInfos.empty()) {
9523         APP_LOGW("bundleInfos is empty");
9524         return ERR_BUNDLE_MANAGER_INVALID_DEVELOPERID;
9525     }
9526     APP_LOGI("have %{public}d applications, their developerId is %{public}s", requestUserId, developerId.c_str());
9527     return ERR_OK;
9528 }
9529 
GetDeveloperIds(const std::string & appDistributionType,std::vector<std::string> & developerIdList,int32_t userId)9530 ErrCode BundleDataMgr::GetDeveloperIds(const std::string &appDistributionType,
9531     std::vector<std::string> &developerIdList, int32_t userId)
9532 {
9533     int32_t requestUserId = GetUserId(userId);
9534     APP_LOGI("requestUserId: %{public}d", requestUserId);
9535     if (requestUserId == Constants::INVALID_USERID) {
9536         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9537     }
9538 
9539     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9540     if (bundleInfos_.empty()) {
9541         APP_LOGW("bundleInfos_ data is empty");
9542         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9543     }
9544     std::set<std::string> developerIdSet;
9545     for (const auto &item : bundleInfos_) {
9546         const InnerBundleInfo &innerBundleInfo = item.second;
9547         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9548             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9549             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9550                 innerBundleInfo.GetBundleName().c_str());
9551             continue;
9552         }
9553 
9554         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9555         auto flag = GET_BASIC_APPLICATION_INFO;
9556         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9557             continue;
9558         }
9559         // check appDistributionType
9560         if (!appDistributionType.empty() && innerBundleInfo.GetAppDistributionType() != appDistributionType) {
9561             continue;
9562         }
9563 
9564         std::string developerIdExist;
9565         std::string odidExist;
9566         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9567         developerIdSet.emplace(developerIdExist);
9568     }
9569     for (const std::string &developerId : developerIdSet) {
9570         developerIdList.emplace_back(developerId);
9571     }
9572     APP_LOGI("have %{public}d developers, their appDistributionType is %{public}s",
9573         static_cast<int32_t>(developerIdList.size()), appDistributionType.c_str());
9574     return ERR_OK;
9575 }
9576 
SwitchUninstallState(const std::string & bundleName,const bool & state,const bool isNeedSendNotify,bool & stateChange)9577 ErrCode BundleDataMgr::SwitchUninstallState(const std::string &bundleName, const bool &state,
9578     const bool isNeedSendNotify, bool &stateChange)
9579 {
9580     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9581     auto infoItem = bundleInfos_.find(bundleName);
9582     if (infoItem == bundleInfos_.end()) {
9583         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9584         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9585     }
9586     InnerBundleInfo &innerBundleInfo = infoItem->second;
9587     if (!innerBundleInfo.IsRemovable() && state) {
9588         APP_LOGW("the bundle : %{public}s is not removable", bundleName.c_str());
9589         return ERR_BUNDLE_MANAGER_BUNDLE_CAN_NOT_BE_UNINSTALLED;
9590     }
9591     if (innerBundleInfo.GetUninstallState() == state) {
9592         stateChange = false;
9593         return ERR_OK;
9594     }
9595     innerBundleInfo.SetUninstallState(state);
9596     innerBundleInfo.SetNeedSendNotify(isNeedSendNotify);
9597     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9598         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9599         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9600     }
9601     stateChange = true;
9602     return ERR_OK;
9603 }
9604 
AddCloneBundle(const std::string & bundleName,const InnerBundleCloneInfo & attr)9605 ErrCode BundleDataMgr::AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)
9606 {
9607     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9608     auto infoItem = bundleInfos_.find(bundleName);
9609     if (infoItem == bundleInfos_.end()) {
9610         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9611         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9612     }
9613     InnerBundleInfo &innerBundleInfo = infoItem->second;
9614     ErrCode res = innerBundleInfo.AddCloneBundle(attr);
9615     if (res != ERR_OK) {
9616         APP_LOGE("innerBundleInfo addCloneBundleInfo fail");
9617         return res;
9618     }
9619     APP_LOGD("update bundle info in memory for add clone, userId: %{public}d, appIndex: %{public}d",
9620         attr.userId, attr.appIndex);
9621     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9622     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9623     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9624         innerBundleInfo.SetBundleStatus(nowBundleStatus);
9625         innerBundleInfo.RemoveCloneBundle(attr.userId, attr.appIndex);
9626         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9627         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9628     }
9629     innerBundleInfo.SetBundleStatus(nowBundleStatus);
9630     APP_LOGD("update bundle info in storage for add clone, userId: %{public}d, appIndex: %{public}d",
9631         attr.userId, attr.appIndex);
9632     return ERR_OK;
9633 }
9634 
FilterAbilityInfosByAppLinking(const Want & want,int32_t flags,std::vector<AbilityInfo> & abilityInfos) const9635 void BundleDataMgr::FilterAbilityInfosByAppLinking(const Want &want, int32_t flags,
9636     std::vector<AbilityInfo> &abilityInfos) const
9637 {
9638 #ifdef APP_DOMAIN_VERIFY_ENABLED
9639     APP_LOGD("FilterAbility start");
9640     if (abilityInfos.empty()) {
9641         APP_LOGD("abilityInfos is empty");
9642         return;
9643     }
9644     if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
9645         APP_LOGD("scheme is not https");
9646         if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9647             APP_LOGI("using app linking flag and scheme is not https, return empty list");
9648             abilityInfos.clear();
9649         }
9650         return;
9651     }
9652     std::vector<AbilityInfo> filteredAbilityInfos;
9653     // call FiltedAbilityInfos
9654     APP_LOGI("call FilterAbilities");
9655     std::string identity = IPCSkeleton::ResetCallingIdentity();
9656     if (!DelayedSingleton<AppDomainVerify::AppDomainVerifyMgrClient>::GetInstance()->FilterAbilities(
9657         want, abilityInfos, filteredAbilityInfos)) {
9658         APP_LOGE("FilterAbilities failed");
9659     }
9660     IPCSkeleton::SetCallingIdentity(identity);
9661     if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9662         APP_LOGD("return filteredAbilityInfos");
9663         abilityInfos = filteredAbilityInfos;
9664         for (auto &abilityInfo : abilityInfos) {
9665             abilityInfo.linkType = LinkType::APP_LINK;
9666         }
9667         return;
9668     }
9669     for (auto &filteredAbilityInfo : filteredAbilityInfos) {
9670         for (auto &abilityInfo : abilityInfos) {
9671             if (filteredAbilityInfo.bundleName == abilityInfo.bundleName &&
9672                 filteredAbilityInfo.name == abilityInfo.name) {
9673                 abilityInfo.linkType = LinkType::APP_LINK;
9674                 break;
9675             }
9676         }
9677     }
9678     return;
9679 #else
9680     APP_LOGI("AppDomainVerify is not enabled");
9681     if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9682         APP_LOGI("has flag and return empty list");
9683         abilityInfos.clear();
9684     }
9685     return;
9686 #endif
9687 }
9688 
HasAppLinkingFlag(uint32_t flags)9689 bool BundleDataMgr::HasAppLinkingFlag(uint32_t flags)
9690 {
9691     return (flags & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
9692         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING);
9693 }
9694 
RemoveCloneBundle(const std::string & bundleName,const int32_t userId,int32_t appIndex)9695 ErrCode BundleDataMgr::RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)
9696 {
9697     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9698     auto infoItem = bundleInfos_.find(bundleName);
9699     if (infoItem == bundleInfos_.end()) {
9700         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9701         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9702     }
9703     InnerBundleInfo &innerBundleInfo = infoItem->second;
9704     ErrCode res = innerBundleInfo.RemoveCloneBundle(userId, appIndex);
9705     if (res != ERR_OK) {
9706         APP_LOGE("innerBundleInfo RemoveCloneBundle fail");
9707         return res;
9708     }
9709     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9710     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9711     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9712         innerBundleInfo.SetBundleStatus(nowBundleStatus);
9713         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9714         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9715     }
9716     innerBundleInfo.SetBundleStatus(nowBundleStatus);
9717     DeleteDesktopShortcutInfo(bundleName, userId, appIndex);
9718     if (DeleteShortcutVisibleInfo(bundleName, userId, appIndex) != ERR_OK) {
9719         APP_LOGE("DeleteShortcutVisibleInfo failed, bundleName: %{public}s, userId: %{public}d, appIndex: %{public}d",
9720             bundleName.c_str(), userId, appIndex);
9721     }
9722     return ERR_OK;
9723 }
9724 
QueryAbilityInfoByContinueType(const std::string & bundleName,const std::string & continueType,AbilityInfo & abilityInfo,int32_t userId,int32_t appIndex) const9725 ErrCode BundleDataMgr::QueryAbilityInfoByContinueType(const std::string &bundleName,
9726     const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const
9727 {
9728     int32_t requestUserId = GetUserId(userId);
9729     APP_LOGI("requestUserId: %{public}d", requestUserId);
9730     if (requestUserId == Constants::INVALID_USERID) {
9731         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9732     }
9733 
9734     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9735     if (bundleInfos_.empty()) {
9736         APP_LOGW("bundleInfos_ data is empty");
9737         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9738     }
9739     InnerBundleInfo innerBundleInfo;
9740     if (appIndex == 0) {
9741         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, 0, innerBundleInfo, requestUserId);
9742         if (ret != ERR_OK) {
9743             APP_LOGD("QueryAbilityInfoByContinueType failed, bundleName:%{public}s", bundleName.c_str());
9744             return ret;
9745         }
9746     }
9747     if (appIndex > 0) {
9748         if (sandboxAppHelper_ == nullptr) {
9749             APP_LOGW("sandboxAppHelper_ is nullptr");
9750             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9751         }
9752         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
9753         if (ret != ERR_OK) {
9754             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
9755                 ret, bundleName.c_str());
9756             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9757         }
9758     }
9759     auto ability = innerBundleInfo.FindAbilityInfo(continueType, requestUserId);
9760     if (!ability) {
9761         APP_LOGW("ability not found, bundleName:%{public}s, coutinueType:%{public}s",
9762             bundleName.c_str(), continueType.c_str());
9763         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9764     }
9765     abilityInfo = (*ability);
9766     InnerBundleUserInfo innerBundleUserInfo;
9767     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
9768         abilityInfo.uid = innerBundleUserInfo.uid;
9769     }
9770     return ERR_OK;
9771 }
9772 
QueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9773 ErrCode BundleDataMgr::QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9774     int32_t appIndex, AbilityInfo &abilityInfo) const
9775 {
9776     std::string bundleName = element.GetBundleName();
9777     std::string abilityName = element.GetAbilityName();
9778     std::string moduleName = element.GetModuleName();
9779     LOG_D(BMS_TAG_QUERY,
9780         "QueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9781         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9782     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9783     int32_t requestUserId = GetUserId(userId);
9784     if (requestUserId == Constants::INVALID_USERID) {
9785         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9786     }
9787 
9788     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9789     InnerBundleInfo innerBundleInfo;
9790 
9791     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9792     if (ret != ERR_OK) {
9793         LOG_D(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9794         return ret;
9795     }
9796 
9797     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9798     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9799     if (!ability) {
9800         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9801             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9802         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9803     }
9804     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9805 }
9806 
ExplicitQueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9807 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9808     int32_t appIndex, AbilityInfo &abilityInfo) const
9809 {
9810     std::string bundleName = element.GetBundleName();
9811     std::string abilityName = element.GetAbilityName();
9812     std::string moduleName = element.GetModuleName();
9813     LOG_D(BMS_TAG_QUERY,
9814         "ExplicitQueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9815         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9816     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9817     int32_t requestUserId = GetUserId(userId);
9818     if (requestUserId == Constants::INVALID_USERID) {
9819         return false;
9820     }
9821     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9822     InnerBundleInfo innerBundleInfo;
9823 
9824     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9825     if (!ret) {
9826         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9827         return false;
9828     }
9829 
9830     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9831     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
9832     if (!ability) {
9833         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9834             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9835         return false;
9836     }
9837     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9838 }
9839 
ExplicitQueryCloneAbilityInfoV9(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9840 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId,
9841     int32_t appIndex, AbilityInfo &abilityInfo) const
9842 {
9843     std::string bundleName = element.GetBundleName();
9844     std::string abilityName = element.GetAbilityName();
9845     std::string moduleName = element.GetModuleName();
9846     LOG_D(BMS_TAG_QUERY,
9847         "ExplicitQueryCloneAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9848         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9849     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9850     int32_t requestUserId = GetUserId(userId);
9851     if (requestUserId == Constants::INVALID_USERID) {
9852         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9853     }
9854     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9855     InnerBundleInfo innerBundleInfo;
9856 
9857     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9858     if (ret != ERR_OK) {
9859         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
9860         return ret;
9861     }
9862 
9863     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9864     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9865     if (!ability) {
9866         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9867             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9868         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9869     }
9870     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9871 }
9872 
GetCloneBundleInfo(const std::string & bundleName,int32_t flags,int32_t appIndex,BundleInfo & bundleInfo,int32_t userId) const9873 ErrCode BundleDataMgr::GetCloneBundleInfo(
9874     const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const
9875 {
9876     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
9877     if (userId == Constants::ANY_USERID) {
9878         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
9879             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
9880             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9881         }
9882         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
9883     }
9884 
9885     int32_t requestUserId = GetUserId(userId);
9886     if (requestUserId == Constants::INVALID_USERID) {
9887         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9888     }
9889     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9890     InnerBundleInfo innerBundleInfo;
9891 
9892     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9893     if (ret != ERR_OK) {
9894         LOG_D(BMS_TAG_QUERY, "GetCloneBundleInfo failed, error code: %{public}d, bundleName:%{public}s",
9895             ret, bundleName.c_str());
9896         return ret;
9897     }
9898 
9899     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9900     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
9901 
9902     ProcessCertificate(bundleInfo, bundleName, flags);
9903     ProcessBundleMenu(bundleInfo, flags, true);
9904     ProcessBundleRouterMap(bundleInfo, flags);
9905     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
9906         bundleName.c_str(), userId);
9907     return ERR_OK;
9908 }
9909 
QueryAllCloneExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9910 void BundleDataMgr::QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId,
9911     std::vector<ExtensionAbilityInfo> &infos) const
9912 {
9913     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9914     int32_t requestUserId = GetUserId(userId);
9915     if (requestUserId == Constants::INVALID_USERID) {
9916         LOG_D(BMS_TAG_QUERY, "invalid user");
9917         return;
9918     }
9919 
9920     ElementName element = want.GetElement();
9921     std::string bundleName = element.GetBundleName();
9922     std::string extensionName = element.GetAbilityName();
9923     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9924         bundleName.c_str(), extensionName.c_str());
9925 
9926     if (!bundleName.empty() && !extensionName.empty()) {
9927         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9928         if (cloneAppIndexes.empty()) {
9929             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9930             return;
9931         }
9932         for (int32_t appIndex: cloneAppIndexes) {
9933             ExtensionAbilityInfo info;
9934             ErrCode ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
9935             if (ret != ERR_OK) {
9936                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9937                 continue;
9938             }
9939             infos.emplace_back(info);
9940         }
9941         return;
9942     } else if (!bundleName.empty()) {
9943         ImplicitQueryCurCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9944     } else {
9945         ImplicitQueryAllCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9946     }
9947 }
9948 
QueryAllCloneExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9949 void BundleDataMgr::QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
9950     std::vector<ExtensionAbilityInfo> &infos) const
9951 {
9952     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9953     int32_t requestUserId = GetUserId(userId);
9954     if (requestUserId == Constants::INVALID_USERID) {
9955         LOG_D(BMS_TAG_QUERY, "invalid user");
9956         return;
9957     }
9958 
9959     ElementName element = want.GetElement();
9960     std::string bundleName = element.GetBundleName();
9961     std::string extensionName = element.GetAbilityName();
9962     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9963         bundleName.c_str(), extensionName.c_str());
9964 
9965     if (!bundleName.empty() && !extensionName.empty()) {
9966         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9967         if (cloneAppIndexes.empty()) {
9968             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9969             return;
9970         }
9971         for (int32_t appIndex: cloneAppIndexes) {
9972             ExtensionAbilityInfo info;
9973             ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
9974             if (ret != ERR_OK) {
9975                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9976                 continue;
9977             }
9978             infos.emplace_back(info);
9979         }
9980         return;
9981     } else if (!bundleName.empty()) {
9982         ImplicitQueryCurCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9983     } else {
9984         ImplicitQueryAllCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9985     }
9986 }
9987 
ImplicitQueryCurCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9988 bool BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9989     std::vector<ExtensionAbilityInfo> &abilityInfos) const
9990 {
9991     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfos");
9992     std::string bundleName = want.GetElement().GetBundleName();
9993 
9994     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
9995     InnerBundleInfo innerBundleInfo;
9996     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId);
9997     if (!ret) {
9998         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfos failed");
9999         return false;
10000     }
10001     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
10002     if (cloneAppIndexes.empty()) {
10003         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfos empty");
10004         return true;
10005     }
10006     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10007     for (int32_t appIndex: cloneAppIndexes) {
10008         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10009             LOG_D(BMS_TAG_QUERY,
10010                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10011                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10012             continue;
10013         }
10014         GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
10015     }
10016     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfos");
10017     return true;
10018 }
10019 
ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const10020 ErrCode BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
10021     std::vector<ExtensionAbilityInfo> &abilityInfos) const
10022 {
10023     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfosV9");
10024     std::string bundleName = want.GetElement().GetBundleName();
10025 
10026     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10027     InnerBundleInfo innerBundleInfo;
10028     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
10029     if (ret != ERR_OK) {
10030         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfosV9 failed");
10031         return ret;
10032     }
10033     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
10034     if (cloneAppIndexes.empty()) {
10035         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfosV9 empty");
10036         return ERR_OK;
10037     }
10038     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10039     for (int32_t appIndex: cloneAppIndexes) {
10040         if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10041             LOG_D(BMS_TAG_QUERY,
10042                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10043                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10044             continue;
10045         }
10046         GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
10047     }
10048     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfosV9");
10049     return ERR_OK;
10050 }
10051 
ImplicitQueryAllCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const10052 bool BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
10053     std::vector<ExtensionAbilityInfo> &infos) const
10054 {
10055     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10056     for (const auto &item : bundleInfos_) {
10057         const InnerBundleInfo &innerBundleInfo = item.second;
10058         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
10059         if (cloneAppIndexes.empty()) {
10060             continue;
10061         }
10062         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10063         for (int32_t appIndex: cloneAppIndexes) {
10064             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10065                 LOG_D(BMS_TAG_QUERY,
10066                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10067                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10068                 continue;
10069             }
10070             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10071             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
10072         }
10073     }
10074     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
10075     return true;
10076 }
10077 
ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const10078 ErrCode BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
10079     std::vector<ExtensionAbilityInfo> &infos) const
10080 {
10081     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10082     for (const auto &item : bundleInfos_) {
10083         const InnerBundleInfo &innerBundleInfo = item.second;
10084         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
10085         if (cloneAppIndexes.empty()) {
10086             continue;
10087         }
10088         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10089         for (int32_t appIndex: cloneAppIndexes) {
10090             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
10091                 LOG_D(BMS_TAG_QUERY,
10092                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
10093                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
10094                 continue;
10095             }
10096             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
10097             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
10098         }
10099     }
10100     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
10101     return ERR_OK;
10102 }
10103 
GetAppIdByBundleName(const std::string & bundleName,std::string & appId) const10104 ErrCode BundleDataMgr::GetAppIdByBundleName(
10105     const std::string &bundleName, std::string &appId) const
10106 {
10107     HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr);
10108     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10109     auto item = bundleInfos_.find(bundleName);
10110     if (item == bundleInfos_.end()) {
10111         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10112     }
10113 
10114     appId = item->second.GetBaseBundleInfo().appId;
10115     return ERR_OK;
10116 }
10117 
GetAppIdAndAppIdentifierByBundleName(const std::string & bundleName,std::string & appId,std::string & appIdentifier) const10118 ErrCode BundleDataMgr::GetAppIdAndAppIdentifierByBundleName(
10119     const std::string &bundleName, std::string &appId, std::string &appIdentifier) const
10120 {
10121     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10122     auto item = bundleInfos_.find(bundleName);
10123     if (item == bundleInfos_.end()) {
10124         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10125     }
10126 
10127     appId = item->second.GetAppId();
10128     appIdentifier = item->second.GetAppIdentifier();
10129     return ERR_OK;
10130 }
10131 
AppIdAndAppIdentifierTransform(const std::string appIdOrAppIdentifier) const10132 std::string BundleDataMgr::AppIdAndAppIdentifierTransform(const std::string appIdOrAppIdentifier) const
10133 {
10134     if (appIdOrAppIdentifier.empty()) {
10135         APP_LOGW("appIdOrAppIdentifier is empty");
10136         return Constants::EMPTY_STRING;
10137     }
10138     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10139     auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appIdOrAppIdentifier](const auto &pair) {
10140         return (appIdOrAppIdentifier == pair.second.GetAppId() ||
10141             appIdOrAppIdentifier == pair.second.GetAppIdentifier());
10142     });
10143     if (it == bundleInfos_.cend()) {
10144         APP_LOGW("can't find appIdOrAppIdentifier in the installed bundle");
10145         return Constants::EMPTY_STRING;
10146     }
10147     if (appIdOrAppIdentifier == it->second.GetAppId()) {
10148         return it->second.GetAppIdentifier();
10149     }
10150     return it->second.GetAppId();
10151 }
10152 
GetSignatureInfoByBundleName(const std::string & bundleName,SignatureInfo & signatureInfo) const10153 ErrCode BundleDataMgr::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const
10154 {
10155     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10156     auto item = bundleInfos_.find(bundleName);
10157     if (item == bundleInfos_.end()) {
10158         LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
10159         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10160     }
10161     const InnerBundleInfo &innerBundleInfo = item->second;
10162     signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
10163     signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
10164     signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
10165     return ERR_OK;
10166 }
10167 
GetSignatureInfoByUid(const int32_t uid,SignatureInfo & signatureInfo) const10168 ErrCode BundleDataMgr::GetSignatureInfoByUid(const int32_t uid, SignatureInfo &signatureInfo) const
10169 {
10170     InnerBundleInfo innerBundleInfo;
10171     ErrCode errCode = GetInnerBundleInfoWithSandboxByUid(uid, innerBundleInfo);
10172     if (errCode != ERR_OK) {
10173         APP_LOGE("Get innerBundleInfo failed, uid:%{public}d", uid);
10174         return errCode;
10175     }
10176     signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
10177     signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
10178     signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
10179     AppProvisionInfo appProvisionInfo;
10180     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->
10181         GetAppProvisionInfo(innerBundleInfo.GetBundleName(), appProvisionInfo)) {
10182         APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", innerBundleInfo.GetBundleName().c_str());
10183     } else {
10184         signatureInfo.certificate = appProvisionInfo.certificate;
10185     }
10186     return ERR_OK;
10187 }
10188 
UpdateAppEncryptedStatus(const std::string & bundleName,bool isExisted,int32_t appIndex,bool needSaveStorage)10189 ErrCode BundleDataMgr::UpdateAppEncryptedStatus(
10190     const std::string &bundleName, bool isExisted, int32_t appIndex, bool needSaveStorage)
10191 {
10192     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10193     auto item = bundleInfos_.find(bundleName);
10194     if (item == bundleInfos_.end()) {
10195         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10196     }
10197     auto res = item->second.UpdateAppEncryptedStatus(bundleName, isExisted, appIndex);
10198     if (res != ERR_OK) {
10199         LOG_E(BMS_TAG_DEFAULT, "UpdateAppEncryptedStatus failed %{public}s %{public}d", bundleName.c_str(), res);
10200         return res;
10201     }
10202     if (dataStorage_ == nullptr) {
10203         LOG_E(BMS_TAG_DEFAULT, "dataStorage_ nullptr");
10204         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
10205     }
10206     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(item->second)) {
10207         APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", bundleName.c_str());
10208         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
10209     }
10210     return ERR_OK;
10211 }
10212 
AddDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)10213 ErrCode BundleDataMgr::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
10214 {
10215     int32_t requestUserId = GetUserId(userId);
10216     if (requestUserId == Constants::INVALID_USERID) {
10217         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
10218         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10219     }
10220     bool isEnabled = false;
10221     ErrCode ret = IsApplicationEnabled(shortcutInfo.bundleName, shortcutInfo.appIndex, isEnabled, userId);
10222     if (ret != ERR_OK) {
10223         APP_LOGD("IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
10224             ret, shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
10225         return ret;
10226     }
10227     if (!isEnabled) {
10228         APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
10229             shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
10230         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
10231     }
10232     bool isIdIllegal = false;
10233     if (!shortcutStorage_->AddDesktopShortcutInfo(shortcutInfo, userId, isIdIllegal)) {
10234         if (isIdIllegal) {
10235             return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
10236         }
10237         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10238     }
10239     return ERR_OK;
10240 }
10241 
DeleteDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)10242 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
10243 {
10244     int32_t requestUserId = GetUserId(userId);
10245     if (requestUserId == Constants::INVALID_USERID) {
10246         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
10247         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10248     }
10249     if (!shortcutStorage_->DeleteDesktopShortcutInfo(shortcutInfo, userId)) {
10250         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10251     }
10252     return ERR_OK;
10253 }
10254 
GetAllDesktopShortcutInfo(int32_t userId,std::vector<ShortcutInfo> & shortcutInfos)10255 ErrCode BundleDataMgr::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
10256 {
10257     int32_t requestUserId = GetUserId(userId);
10258     if (requestUserId == Constants::INVALID_USERID) {
10259         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
10260         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10261     }
10262     std::vector<ShortcutInfo> datas;
10263     shortcutStorage_->GetAllDesktopShortcutInfo(userId, datas);
10264     for (const auto &data : datas) {
10265         bool isEnabled = false;
10266         ErrCode ret = IsApplicationEnabled(data.bundleName, data.appIndex, isEnabled, userId);
10267         if (ret != ERR_OK) {
10268             APP_LOGD(
10269                 "IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
10270                 ret, data.bundleName.c_str(), data.appIndex, userId);
10271             continue;
10272         }
10273         if (!isEnabled) {
10274             APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
10275                 data.bundleName.c_str(), data.appIndex, userId);
10276             continue;
10277         }
10278         shortcutInfos.emplace_back(data);
10279     }
10280     return ERR_OK;
10281 }
10282 
DeleteDesktopShortcutInfo(const std::string & bundleName)10283 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName)
10284 {
10285     APP_LOGD("DeleteDesktopShortcutInfo by uninstall, bundleName:%{public}s", bundleName.c_str());
10286     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName)) {
10287         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10288     }
10289     return ERR_OK;
10290 }
10291 
DeleteDesktopShortcutInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)10292 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
10293 {
10294     APP_LOGD(
10295         "DeleteDesktopShortcutInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
10296         bundleName.c_str(), userId, appIndex);
10297     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName, userId, appIndex)) {
10298         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
10299     }
10300     return ERR_OK;
10301 }
10302 
GetBundleInfosForContinuation(std::vector<BundleInfo> & bundleInfos) const10303 void BundleDataMgr::GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const
10304 {
10305     if (bundleInfos.empty()) {
10306         APP_LOGD("bundleInfos is empty");
10307         return;
10308     }
10309     bundleInfos.erase(std::remove_if(bundleInfos.begin(), bundleInfos.end(), [](BundleInfo bundleInfo) {
10310         for (auto abilityInfo : bundleInfo.abilityInfos) {
10311             if (abilityInfo.continuable) {
10312                 return false;
10313             }
10314         }
10315         return true;
10316         }), bundleInfos.end());
10317 }
10318 
GetContinueBundleNames(const std::string & continueBundleName,std::vector<std::string> & bundleNames,int32_t userId)10319 ErrCode BundleDataMgr::GetContinueBundleNames(
10320     const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
10321 {
10322     auto requestUserId = GetUserId(userId);
10323     if (requestUserId == Constants::INVALID_USERID) {
10324         APP_LOGE("Input invalid userid, userId:%{public}d", userId);
10325         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10326     }
10327     if (continueBundleName.empty()) {
10328         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
10329     }
10330 
10331     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10332     for (const auto &[key, innerInfo] : bundleInfos_) {
10333         if (CheckInnerBundleInfoWithFlags(
10334             innerInfo, BundleFlag::GET_BUNDLE_WITH_ABILITIES, innerInfo.GetResponseUserId(requestUserId)) != ERR_OK) {
10335             continue;
10336         }
10337         for (const auto &[key, abilityInfo] : innerInfo.GetInnerAbilityInfos()) {
10338             if (abilityInfo.continueBundleNames.find(continueBundleName) != abilityInfo.continueBundleNames.end()) {
10339                 bundleNames.emplace_back(abilityInfo.bundleName);
10340                 break;
10341             }
10342         }
10343     }
10344 
10345     APP_LOGD("The number of found continue packs, size:[%{public}d]", static_cast<int32_t>(bundleNames.size()));
10346     return ERR_OK;
10347 }
10348 
IsBundleInstalled(const std::string & bundleName,int32_t userId,int32_t appIndex,bool & isInstalled)10349 ErrCode BundleDataMgr::IsBundleInstalled(const std::string &bundleName, int32_t userId,
10350     int32_t appIndex, bool &isInstalled)
10351 {
10352     int32_t requestUserId = GetUserId(userId);
10353     if (requestUserId == Constants::INVALID_USERID) {
10354         APP_LOGE("name %{public}s invalid userid :%{public}d", bundleName.c_str(), userId);
10355         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10356     }
10357     if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
10358         APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
10359         return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX;
10360     }
10361     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10362     auto item = bundleInfos_.find(bundleName);
10363     if (item == bundleInfos_.end()) {
10364         isInstalled = false;
10365         return ERR_OK;
10366     }
10367     if (item->second.GetInstallMark().status == InstallExceptionStatus::INSTALL_START) {
10368         APP_LOGW("name %{public}s is installing", bundleName.c_str());
10369         isInstalled = false;
10370         return ERR_OK;
10371     }
10372     if ((item->second.GetApplicationBundleType() == BundleType::SHARED) ||
10373         ((item->second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) &&
10374         item->second.GetInnerBundleUserInfos().empty())) {
10375         isInstalled = true;
10376         return ERR_OK;
10377     }
10378     int32_t responseUserId = item->second.GetResponseUserId(requestUserId);
10379     if (responseUserId == Constants::INVALID_USERID) {
10380         isInstalled = false;
10381         return ERR_OK;
10382     }
10383     if (appIndex == 0) {
10384         isInstalled = true;
10385         return ERR_OK;
10386     }
10387     InnerBundleUserInfo innerBundleUserInfo;
10388     if (item->second.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
10389         if (innerBundleUserInfo.cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) !=
10390             innerBundleUserInfo.cloneInfos.end()) {
10391             isInstalled = true;
10392             return ERR_OK;
10393         }
10394     }
10395     isInstalled = false;
10396     return ERR_OK;
10397 }
10398 
UpdateIsPreInstallApp(const std::string & bundleName,bool isPreInstallApp)10399 void BundleDataMgr::UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)
10400 {
10401     APP_LOGD("UpdateIsPreInstallApp %{public}s", bundleName.c_str());
10402     if (bundleName.empty()) {
10403         APP_LOGW("bundleName is empty");
10404         return;
10405     }
10406 
10407     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10408     auto infoItem = bundleInfos_.find(bundleName);
10409     if (infoItem == bundleInfos_.end()) {
10410         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
10411         return;
10412     }
10413 
10414     if (infoItem->second.IsPreInstallApp() != isPreInstallApp) {
10415         infoItem->second.SetIsPreInstallApp(isPreInstallApp);
10416         SaveInnerBundleInfo(infoItem->second);
10417     }
10418 }
10419 
GetBundleNameByAppId(const std::string & appId,std::string & bundleName)10420 ErrCode BundleDataMgr::GetBundleNameByAppId(const std::string &appId, std::string &bundleName)
10421 {
10422     APP_LOGD("start GetBundleNameByAppId %{private}s", appId.c_str());
10423     if (appId.empty()) {
10424         APP_LOGW("appId is empty");
10425         return ERR_APPEXECFWK_INSTALL_PARAM_ERROR;
10426     }
10427     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10428     for (const auto &[key, innerInfo] : bundleInfos_) {
10429         if (innerInfo.GetAppId() == appId || innerInfo.GetAppIdentifier() == appId) {
10430             bundleName = key;
10431             return ERR_OK;
10432         }
10433     }
10434     APP_LOGI("get bundleName failed %{private}s", appId.c_str());
10435     return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10436 }
10437 
GetDirForAtomicService(const std::string & bundleName,std::string & dataDir) const10438 ErrCode BundleDataMgr::GetDirForAtomicService(const std::string &bundleName, std::string &dataDir) const
10439 {
10440     APP_LOGD("start GetDirForAtomicService name: %{public}s", bundleName.c_str());
10441     AccountSA::OhosAccountInfo accountInfo;
10442     auto ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfo(accountInfo);
10443     if (ret != ERR_OK) {
10444         APP_LOGE("GetOhosAccountInfo failed, errCode: %{public}d", ret);
10445         return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
10446     }
10447     dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
10448     return ERR_OK;
10449 }
10450 
GetDirForAtomicServiceByUserId(const std::string & bundleName,int32_t userId,AccountSA::OhosAccountInfo & accountInfo,std::string & dataDir) const10451 ErrCode BundleDataMgr::GetDirForAtomicServiceByUserId(const std::string &bundleName, int32_t userId,
10452     AccountSA::OhosAccountInfo &accountInfo, std::string &dataDir) const
10453 {
10454     APP_LOGD("start GetDirForAtomicServiceByUserId name: %{public}s userId: %{public}d", bundleName.c_str(), userId);
10455     if (accountInfo.uid_.empty()) {
10456         auto ret = AccountSA::OhosAccountKits::GetInstance().GetOsAccountDistributedInfo(userId, accountInfo);
10457         if (ret != ERR_OK) {
10458             APP_LOGE("GetOsAccountDistributedInfo failed, errCode: %{public}d", ret);
10459             return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
10460         }
10461     }
10462     dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
10463     return ERR_OK;
10464 }
10465 
GetDirForApp(const std::string & bundleName,const int32_t appIndex) const10466 std::string BundleDataMgr::GetDirForApp(const std::string &bundleName, const int32_t appIndex) const
10467 {
10468     APP_LOGD("start GetDirForApp name: %{public}s appIndex: %{public}d", bundleName.c_str(), appIndex);
10469     if (appIndex == 0) {
10470         return bundleName;
10471     } else {
10472         return CLONE_APP_DIR_PREFIX + std::to_string(appIndex) + PLUS + bundleName;
10473     }
10474 }
10475 
GetDirByBundleNameAndAppIndex(const std::string & bundleName,const int32_t appIndex,std::string & dataDir)10476 ErrCode BundleDataMgr::GetDirByBundleNameAndAppIndex(const std::string &bundleName, const int32_t appIndex,
10477     std::string &dataDir)
10478 {
10479     APP_LOGD("start GetDir bundleName : %{public}s appIndex : %{public}d", bundleName.c_str(), appIndex);
10480     if (appIndex < 0 || appIndex > ServiceConstants::CLONE_APP_INDEX_MAX) {
10481         return ERR_BUNDLE_MANAGER_GET_DIR_INVALID_APP_INDEX;
10482     }
10483     if (!BundlePermissionMgr::IsNativeTokenType()) {
10484         int32_t callingUid = IPCSkeleton::GetCallingUid();
10485         int32_t userId = callingUid / Constants::BASE_USER_RANGE;
10486         bool isBundleInstalled = false;
10487         auto ret = IsBundleInstalled(bundleName, userId, appIndex, isBundleInstalled);
10488         if (ret != ERR_OK) {
10489             APP_LOGE("IsBundleInstalled failed, ret:%{public}d", ret);
10490             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10491         }
10492         if (!isBundleInstalled) {
10493             APP_LOGE("bundle %{public}s is not installed", bundleName.c_str());
10494             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10495         }
10496     }
10497     BundleType type = BundleType::APP;
10498     GetBundleType(bundleName, type);
10499     if (type == BundleType::ATOMIC_SERVICE) {
10500         return GetDirForAtomicService(bundleName, dataDir);
10501     }
10502     dataDir = GetDirForApp(bundleName, appIndex);
10503     return ERR_OK;
10504 }
10505 
GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,int32_t userId) const10506 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo &innerBundleInfo,
10507     int32_t userId) const
10508 {
10509     std::vector<int32_t> cloneAppIndexes;
10510     InnerBundleUserInfo innerBundleUserInfo;
10511     if (!innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10512         return cloneAppIndexes;
10513     }
10514     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
10515     if (cloneInfos.empty()) {
10516         return cloneAppIndexes;
10517     }
10518     for (const auto &cloneInfo : cloneInfos) {
10519         LOG_D(BMS_TAG_QUERY, "get cloneAppIndexes by inner bundle info: %{public}d", cloneInfo.second.appIndex);
10520         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
10521     }
10522     return cloneAppIndexes;
10523 }
10524 
GetBundleDir(int32_t userId,BundleType type,AccountSA::OhosAccountInfo & accountInfo,BundleDir & bundleDir) const10525 ErrCode BundleDataMgr::GetBundleDir(int32_t userId, BundleType type, AccountSA::OhosAccountInfo &accountInfo,
10526     BundleDir &bundleDir) const
10527 {
10528     APP_LOGD("start GetBundleDir");
10529     if (type == BundleType::ATOMIC_SERVICE) {
10530         std::string dataDir;
10531         auto ret = GetDirForAtomicServiceByUserId(bundleDir.bundleName, userId, accountInfo, dataDir);
10532         if (ret != ERR_OK) {
10533             return ret;
10534         }
10535         bundleDir.dir = dataDir;
10536     } else {
10537         bundleDir.dir = GetDirForApp(bundleDir.bundleName, bundleDir.appIndex);
10538     }
10539     return ERR_OK;
10540 }
10541 
GetAllBundleDirs(int32_t userId,std::vector<BundleDir> & bundleDirs) const10542 ErrCode BundleDataMgr::GetAllBundleDirs(int32_t userId, std::vector<BundleDir> &bundleDirs) const
10543 {
10544     APP_LOGD("start GetAllBundleDirs");
10545     int32_t requestUserId = GetUserId(userId);
10546     if (requestUserId == Constants::INVALID_USERID) {
10547         APP_LOGE("invalid userid :%{public}d", userId);
10548         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10549     }
10550     AccountSA::OhosAccountInfo accountInfo;
10551     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10552     for (const auto &item : bundleInfos_) {
10553         const InnerBundleInfo &info = item.second;
10554         std::string bundleName = info.GetBundleName();
10555         int32_t responseUserId = info.GetResponseUserId(requestUserId);
10556         if (responseUserId == Constants::INVALID_USERID) {
10557             APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
10558             continue;
10559         }
10560         BundleType type = info.GetApplicationBundleType();
10561         if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
10562             continue;
10563         }
10564 
10565         std::vector<int32_t> allAppIndexes = {0};
10566         if (type == BundleType::APP) {
10567             std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
10568             allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
10569         }
10570         for (int32_t appIndex: allAppIndexes) {
10571             BundleDir bundleDir;
10572             bundleDir.bundleName = bundleName;
10573             bundleDir.appIndex = appIndex;
10574             auto ret = GetBundleDir(responseUserId, type, accountInfo, bundleDir);
10575             if (ret != ERR_OK) {
10576                 return ret;
10577             }
10578             bundleDirs.emplace_back(bundleDir);
10579         }
10580     }
10581     return ERR_OK;
10582 }
10583 
RestoreUidAndGidFromUninstallInfo()10584 void BundleDataMgr::RestoreUidAndGidFromUninstallInfo()
10585 {
10586     std::unique_lock<ffrt::shared_mutex> lock(bundleIdMapMutex_);
10587     std::map<std::string, UninstallBundleInfo> uninstallBundleInfos;
10588     if (!GetAllUninstallBundleInfo(uninstallBundleInfos)) {
10589         return;
10590     }
10591     std::map<int32_t, std::string> uninstallBundleIdMap;
10592     for (const auto &info : uninstallBundleInfos) {
10593         if (info.second.userInfos.empty()) {
10594             continue;
10595         }
10596         int32_t userId = -1;
10597         if (!OHOS::StrToInt(info.second.userInfos.begin()->first, userId)) {
10598             APP_LOGW("strToInt fail");
10599             continue;
10600         }
10601         int32_t bundleId = info.second.userInfos.begin()->second.uid
10602             - userId * Constants::BASE_USER_RANGE;
10603         if (bundleId < Constants::BASE_APP_UID || bundleId >= MAX_APP_UID) {
10604             APP_LOGW("invalid bundleId");
10605             continue;
10606         }
10607         auto item = bundleIdMap_.find(bundleId);
10608         if (item == bundleIdMap_.end()) {
10609             uninstallBundleIdMap.emplace(bundleId, info.first);
10610             BundleUtil::MakeFsConfig(info.first, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
10611             BundleUtil::MakeFsConfig(info.first, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
10612             BundleUtil::MakeFsConfig(info.first, ServiceConstants::HMDFS_CONFIG_PATH,
10613                 info.second.appProvisionType, Constants::APP_PROVISION_TYPE_FILE_NAME);
10614         }
10615     }
10616     for (const auto &item : uninstallBundleIdMap) {
10617         bundleIdMap_.emplace(item.first, item.second);
10618     }
10619 }
10620 
GetAssetAccessGroups(const std::string & bundleName,std::vector<std::string> & assetAccessGroups) const10621 ErrCode BundleDataMgr::GetAssetAccessGroups(const std::string &bundleName,
10622     std::vector<std::string> &assetAccessGroups) const
10623 {
10624     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10625     auto item = bundleInfos_.find(bundleName);
10626     if (item == bundleInfos_.end()) {
10627         APP_LOGE("%{public}s not exist", bundleName.c_str());
10628         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10629     }
10630     assetAccessGroups = item->second.GetAssetAccessGroups();
10631     return ERR_OK;
10632 }
10633 
GetDeveloperId(const std::string & bundleName,std::string & developerId) const10634 ErrCode BundleDataMgr::GetDeveloperId(const std::string &bundleName, std::string &developerId) const
10635 {
10636     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10637     auto item = bundleInfos_.find(bundleName);
10638     if (item == bundleInfos_.end()) {
10639         APP_LOGE("%{public}s not exist", bundleName.c_str());
10640         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10641     }
10642     developerId = item->second.GetDeveloperId();
10643     return ERR_OK;
10644 }
10645 
IsObtainAbilityInfo(const Want & want,int32_t userId,AbilityInfo & abilityInfo)10646 bool BundleDataMgr::IsObtainAbilityInfo(const Want &want, int32_t userId, AbilityInfo &abilityInfo)
10647 {
10648     APP_LOGI("IsObtainAbilityInfo");
10649     std::string bundleName = want.GetElement().GetBundleName();
10650     std::string abilityName = want.GetElement().GetAbilityName();
10651     std::string moduleName = want.GetElement().GetModuleName();
10652     if (bundleName.empty()) {
10653         APP_LOGE("bundle name empty");
10654         return false;
10655     }
10656     {
10657         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10658         const auto infoItem = bundleInfos_.find(bundleName);
10659         if (infoItem == bundleInfos_.end()) {
10660             APP_LOGE("%{public}s not found", bundleName.c_str());
10661             return false;
10662         }
10663         if (abilityName.empty()) {
10664             return true;
10665         }
10666     }
10667     int32_t flags = static_cast<int32_t>(GET_ABILITY_INFO_DEFAULT);
10668     return ExplicitQueryAbilityInfo(want, flags, userId, abilityInfo);
10669 }
10670 
GetAllPluginInfo(const std::string & hostBundleName,int32_t userId,std::vector<PluginBundleInfo> & pluginBundleInfos) const10671 ErrCode BundleDataMgr::GetAllPluginInfo(const std::string &hostBundleName, int32_t userId,
10672     std::vector<PluginBundleInfo> &pluginBundleInfos) const
10673 {
10674     APP_LOGD("start GetAllPluginInfo -n : %{public}s, -u : %{public}d", hostBundleName.c_str(), userId);
10675     int32_t requestUserId = GetUserId(userId);
10676     if (requestUserId == Constants::INVALID_USERID) {
10677         APP_LOGE("invalid userid :%{public}d", userId);
10678         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10679     }
10680     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10681     auto item = bundleInfos_.find(hostBundleName);
10682     if (item == bundleInfos_.end()) {
10683         APP_LOGE("hostBundleName: %{public}s does not exist", hostBundleName.c_str());
10684         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10685     }
10686     const InnerBundleInfo &innerBundleInfo = item->second;
10687     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
10688     if (responseUserId == Constants::INVALID_USERID) {
10689         APP_LOGE("-n : %{public}s is not installed in user %{public}d or 0", hostBundleName.c_str(), userId);
10690         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10691     }
10692     std::unordered_map<std::string, PluginBundleInfo> pluginInfoMap = innerBundleInfo.GetAllPluginBundleInfo();
10693     InnerBundleUserInfo innerBundleUserInfo;
10694     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10695         for (const auto &pluginName : innerBundleUserInfo.installedPluginSet) {
10696             if (pluginInfoMap.find(pluginName) != pluginInfoMap.end()) {
10697                 APP_LOGD("pluginName: %{public}s", pluginName.c_str());
10698                 pluginBundleInfos.emplace_back(pluginInfoMap[pluginName]);
10699             }
10700         }
10701     }
10702     return ERR_OK;
10703 }
10704 
AddPluginInfo(const std::string & bundleName,const PluginBundleInfo & pluginBundleInfo,const int32_t userId)10705 ErrCode BundleDataMgr::AddPluginInfo(const std::string &bundleName,
10706     const PluginBundleInfo &pluginBundleInfo, const int32_t userId)
10707 {
10708     APP_LOGD("start AddPluginInfo");
10709     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10710     auto item = bundleInfos_.find(bundleName);
10711     if (item == bundleInfos_.end()) {
10712         APP_LOGE("%{public}s not exist", bundleName.c_str());
10713         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10714     }
10715     InnerBundleInfo newInfo = item->second;
10716     if (!newInfo.AddPluginBundleInfo(pluginBundleInfo, userId)) {
10717         APP_LOGE("%{public}s add plugin info failed", bundleName.c_str());
10718         return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10719     }
10720     if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10721         APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10722         return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10723     }
10724     bundleInfos_.at(bundleName) = newInfo;
10725     return ERR_OK;
10726 }
10727 
RemovePluginInfo(const std::string & bundleName,const std::string & pluginBundleName,const int32_t userId)10728 ErrCode BundleDataMgr::RemovePluginInfo(const std::string &bundleName,
10729     const std::string &pluginBundleName, const int32_t userId)
10730 {
10731     APP_LOGD("start RemovePluginInfo");
10732     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10733     auto item = bundleInfos_.find(bundleName);
10734     if (item == bundleInfos_.end()) {
10735         APP_LOGE("%{public}s not exist", bundleName.c_str());
10736         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10737     }
10738     InnerBundleInfo newInfo = item->second;
10739     if (!newInfo.RemovePluginBundleInfo(pluginBundleName, userId)) {
10740         APP_LOGE("%{public}s remove plugin info failed", bundleName.c_str());
10741         return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10742     }
10743     if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10744         APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10745         return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10746     }
10747     bundleInfos_.at(bundleName) = newInfo;
10748     return ERR_OK;
10749 }
10750 
GetPluginBundleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const int32_t userId,PluginBundleInfo & pluginBundleInfo)10751 bool BundleDataMgr::GetPluginBundleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10752     const int32_t userId, PluginBundleInfo &pluginBundleInfo)
10753 {
10754     APP_LOGD("bundleName:%{public}s start GetPluginBundleInfo", hostBundleName.c_str());
10755     if (hostBundleName.empty() || pluginBundleName.empty()) {
10756         APP_LOGW("bundleName is empty");
10757         return false;
10758     }
10759 
10760     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10761     auto infoItem = bundleInfos_.find(hostBundleName);
10762     if (infoItem == bundleInfos_.end()) {
10763         APP_LOGW_NOFUNC("%{public}s GetPluginBundleInfo not found %{public}s", hostBundleName.c_str(),
10764             pluginBundleName.c_str());
10765         return false;
10766     }
10767     std::unordered_map<std::string, PluginBundleInfo> pluginBundleInfos;
10768     if (!infoItem->second.GetPluginBundleInfos(userId, pluginBundleInfos)) {
10769         APP_LOGE("bundleName:%{public}s can not find userId %{public}d", hostBundleName.c_str(), userId);
10770         return false;
10771     }
10772     auto it = pluginBundleInfos.find(pluginBundleName);
10773     if (it == pluginBundleInfos.end()) {
10774         APP_LOGE("bundleName:%{public}s can not find plugin info for %{public}s in user(%{public}d)",
10775             hostBundleName.c_str(), pluginBundleName.c_str(), userId);
10776         return false;
10777     }
10778     pluginBundleInfo = it->second;
10779     return true;
10780 }
10781 
FetchPluginBundleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,PluginBundleInfo & pluginBundleInfo)10782 bool BundleDataMgr::FetchPluginBundleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10783     PluginBundleInfo &pluginBundleInfo)
10784 {
10785     APP_LOGD("bundleName:%{public}s start FetchPluginBundleInfo, plugin:%{public}s",
10786         hostBundleName.c_str(), pluginBundleName.c_str());
10787     if (hostBundleName.empty() || pluginBundleName.empty()) {
10788         APP_LOGW("bundleName is empty");
10789         return false;
10790     }
10791 
10792     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10793     auto infoItem = bundleInfos_.find(hostBundleName);
10794     if (infoItem == bundleInfos_.end()) {
10795         APP_LOGW_NOFUNC("%{public}s FetchPluginBundleInfo not found %{public}s", hostBundleName.c_str(),
10796             pluginBundleName.c_str());
10797         return false;
10798     }
10799     std::unordered_map<std::string, PluginBundleInfo> pluginInfoMap = infoItem->second.GetAllPluginBundleInfo();
10800     auto iter = pluginInfoMap.find(pluginBundleName);
10801     if (iter != pluginInfoMap.end()) {
10802         pluginBundleInfo = iter->second;
10803         return true;
10804     }
10805     APP_LOGE("bundleName:%{public}s can not find plugin info, plugin:%{public}s",
10806         hostBundleName.c_str(), pluginBundleName.c_str());
10807     return false;
10808 }
10809 
UpdatePluginBundleInfo(const std::string & hostBundleName,const PluginBundleInfo & pluginBundleInfo)10810 ErrCode BundleDataMgr::UpdatePluginBundleInfo(const std::string &hostBundleName,
10811     const PluginBundleInfo &pluginBundleInfo)
10812 {
10813     APP_LOGD("hostBundleName:%{public}s start UpdatePluginBundleInfo, plugin:%{public}s",
10814         hostBundleName.c_str(), pluginBundleInfo.pluginBundleName.c_str());
10815     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10816     auto item = bundleInfos_.find(hostBundleName);
10817     if (item == bundleInfos_.end()) {
10818         APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10819         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10820     }
10821     InnerBundleInfo newInfo = item->second;
10822     if (!newInfo.UpdatePluginBundleInfo(pluginBundleInfo)) {
10823         APP_LOGE("%{public}s update plugin info failed", hostBundleName.c_str());
10824         return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10825     }
10826     if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10827         APP_LOGE("save InnerBundleInfo:%{public}s failed, plugin:%{public}s",
10828             hostBundleName.c_str(), pluginBundleInfo.pluginBundleName.c_str());
10829         return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10830     }
10831     bundleInfos_.at(hostBundleName) = newInfo;
10832     return ERR_OK;
10833 }
10834 
RemovePluginFromUserInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const int32_t userId)10835 ErrCode BundleDataMgr::RemovePluginFromUserInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10836     const int32_t userId)
10837 {
10838     APP_LOGD("hostBundleName:%{public}s start RemovePluginFromUserInfo, plugin:%{public}s",
10839         hostBundleName.c_str(), pluginBundleName.c_str());
10840     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10841     auto item = bundleInfos_.find(hostBundleName);
10842     if (item == bundleInfos_.end()) {
10843         APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10844         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10845     }
10846     InnerBundleInfo newInfo = item->second;
10847     if (!newInfo.RemovePluginFromUserInfo(pluginBundleName, userId)) {
10848         APP_LOGE("%{public}s reomve plugin info failed", hostBundleName.c_str());
10849         return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10850     }
10851     if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10852         APP_LOGE("save InnerBundleInfo:%{public}s failed, plugin:%{public}s",
10853             hostBundleName.c_str(), pluginBundleName.c_str());
10854         return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10855     }
10856     bundleInfos_.at(hostBundleName) = newInfo;
10857     return ERR_OK;
10858 }
10859 
GetPluginAbilityInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const std::string & pluginModuleName,const std::string & pluginAbilityName,const int32_t userId,AbilityInfo & abilityInfo)10860 ErrCode BundleDataMgr::GetPluginAbilityInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10861     const std::string &pluginModuleName, const std::string &pluginAbilityName, const int32_t userId, AbilityInfo &abilityInfo)
10862 {
10863     APP_LOGD("bundleName:%{public}s start GetPluginAbilityInfo, plugin:%{public}s, abilityName:%{public}s",
10864         hostBundleName.c_str(), pluginBundleName.c_str(), pluginAbilityName.c_str());
10865     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10866     auto item = bundleInfos_.find(hostBundleName);
10867     if (item == bundleInfos_.end()) {
10868         APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10869         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10870     }
10871     std::unordered_map<std::string, PluginBundleInfo> pluginInfos;
10872     if (!item->second.GetPluginBundleInfos(userId, pluginInfos)) {
10873         APP_LOGE("bundleName:%{public}s GetPluginBundleInfos failed, plugin:%{public}s, user: %{public}d",
10874             hostBundleName.c_str(), pluginBundleName.c_str(), userId);
10875         return ERR_APPEXECFWK_GET_PLUGIN_INFO_ERROR;
10876     }
10877     auto it = pluginInfos.find(pluginBundleName);
10878     if (it == pluginInfos.end()) {
10879         APP_LOGE("bundleName: %{public}s can not find plugin: %{public}s",
10880             hostBundleName.c_str(), pluginBundleName.c_str());
10881         return ERR_APPEXECFWK_PLUGIN_NOT_FOUND;
10882     }
10883     if (!it->second.GetAbilityInfoByName(pluginAbilityName, pluginModuleName, abilityInfo)) {
10884         APP_LOGE("plugin: %{public}s can not find ability: %{public}s module: %{public}s",
10885             pluginBundleName.c_str(), pluginAbilityName.c_str(), pluginModuleName.c_str());
10886         return ERR_APPEXECFWK_PLUGIN_ABILITY_NOT_FOUND;
10887     }
10888     return ERR_OK;
10889 }
10890 
GetPluginHapModuleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const std::string & pluginModuleName,const int32_t userId,HapModuleInfo & hapModuleInfo)10891 ErrCode BundleDataMgr::GetPluginHapModuleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10892     const std::string &pluginModuleName, const int32_t userId, HapModuleInfo &hapModuleInfo)
10893 {
10894     APP_LOGD("bundleName:%{public}s start GetPluginHapModuleInfo, plugin:%{public}s, moduleName:%{public}s",
10895         hostBundleName.c_str(), pluginBundleName.c_str(), pluginModuleName.c_str());
10896     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10897     int32_t requestUserId = GetUserId(userId);
10898     if (requestUserId == Constants::INVALID_USERID) {
10899         APP_LOGE("invalid userid :%{public}d", userId);
10900         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10901     }
10902     auto item = bundleInfos_.find(hostBundleName);
10903     if (item == bundleInfos_.end()) {
10904         APP_LOGE("%{public}s not exist", hostBundleName.c_str());
10905         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10906     }
10907     std::unordered_map<std::string, PluginBundleInfo> pluginInfos;
10908     if (!item->second.GetPluginBundleInfos(requestUserId, pluginInfos)) {
10909         APP_LOGE("bundleName:%{public}s GetPluginBundleInfos failed, plugin:%{public}s, user: %{public}d",
10910             hostBundleName.c_str(), pluginBundleName.c_str(), requestUserId);
10911         return ERR_APPEXECFWK_GET_PLUGIN_INFO_ERROR;
10912     }
10913     auto it = pluginInfos.find(pluginBundleName);
10914     if (it == pluginInfos.end()) {
10915         APP_LOGE("bundleName: %{public}s can not find plugin: %{public}s",
10916             hostBundleName.c_str(), pluginBundleName.c_str());
10917         return ERR_APPEXECFWK_PLUGIN_NOT_FOUND;
10918     }
10919     if (!it->second.GetHapModuleInfo(pluginModuleName, hapModuleInfo)) {
10920         APP_LOGE("plugin: %{public}s can not find module: %{public}s",
10921             pluginBundleName.c_str(), pluginModuleName.c_str());
10922         return ERR_APPEXECFWK_PLUGIN_MODULE_NOT_FOUND;
10923     }
10924     return ERR_OK;
10925 }
10926 
RegisterPluginEventCallback(const sptr<IBundleEventCallback> & pluginEventCallback)10927 ErrCode BundleDataMgr::RegisterPluginEventCallback(const sptr<IBundleEventCallback> &pluginEventCallback)
10928 {
10929     if (pluginEventCallback == nullptr) {
10930         APP_LOGW("pluginEventCallback is null");
10931         return ERR_APPEXECFWK_NULL_PTR;
10932     }
10933     std::lock_guard lock(pluginCallbackMutex_);
10934     if (pluginCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
10935         APP_LOGW("pluginCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
10936         return ERR_APPEXECFWK_PLUGIN_CALLBACK_LIST_FULL;
10937     }
10938     if (pluginEventCallback->AsObject() != nullptr) {
10939         sptr<BundleEventCallbackDeathRecipient> deathRecipient =
10940             new (std::nothrow) BundleEventCallbackDeathRecipient();
10941         if (deathRecipient == nullptr) {
10942             APP_LOGW("deathRecipient is null");
10943             return ERR_APPEXECFWK_NULL_PTR;
10944         }
10945         pluginEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
10946     }
10947     pluginCallbackList_.emplace_back(pluginEventCallback);
10948     APP_LOGI("success");
10949     return ERR_OK;
10950 }
10951 
UnregisterPluginEventCallback(const sptr<IBundleEventCallback> & pluginEventCallback)10952 ErrCode BundleDataMgr::UnregisterPluginEventCallback(const sptr<IBundleEventCallback> &pluginEventCallback)
10953 {
10954     if (pluginEventCallback == nullptr) {
10955         APP_LOGW("pluginEventCallback is null");
10956         return ERR_APPEXECFWK_NULL_PTR;
10957     }
10958     std::lock_guard lock(pluginCallbackMutex_);
10959     pluginCallbackList_.erase(std::remove_if(pluginCallbackList_.begin(), pluginCallbackList_.end(),
10960         [&pluginEventCallback](const sptr<IBundleEventCallback> &callback) {
10961             return callback->AsObject() == pluginEventCallback->AsObject();
10962         }), pluginCallbackList_.end());
10963     APP_LOGI("success");
10964     return ERR_OK;
10965 }
10966 
NotifyPluginEventCallback(const EventFwk::CommonEventData & eventData)10967 void BundleDataMgr::NotifyPluginEventCallback(const EventFwk::CommonEventData &eventData)
10968 {
10969     APP_LOGI("begin");
10970     std::lock_guard lock(pluginCallbackMutex_);
10971     for (const auto &callback : pluginCallbackList_) {
10972         callback->OnReceiveEvent(eventData);
10973     }
10974     APP_LOGI("end");
10975 }
10976 
GetAllDynamicIconInfo(const int32_t userId,std::vector<DynamicIconInfo> & dynamicIconInfos)10977 ErrCode BundleDataMgr::GetAllDynamicIconInfo(const int32_t userId, std::vector<DynamicIconInfo> &dynamicIconInfos)
10978 {
10979     APP_LOGI("start userId %{public}d", userId);
10980     if (userId != Constants::UNSPECIFIED_USERID) {
10981         if (!HasUserId(userId)) {
10982             APP_LOGE("userId %{public}d not exist", userId);
10983             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10984         }
10985     }
10986     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10987     for (const auto &item : bundleInfos_) {
10988         item.second.GetAllDynamicIconInfo(userId, dynamicIconInfos);
10989     }
10990     return ERR_OK;
10991 }
10992 
ProcessDynamicIconForOta()10993 void BundleDataMgr::ProcessDynamicIconForOta()
10994 {
10995     std::map<std::string, std::string> bundleNames;
10996     {
10997         // process all old curDynamicIconModule when first ota
10998         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
10999         for (const auto &item : bundleInfos_) {
11000             if (!item.second.GetCurDynamicIconModule().empty()) {
11001                 bundleNames[item.first] = item.second.GetCurDynamicIconModule();
11002             }
11003         }
11004     }
11005     if (bundleNames.empty()) {
11006         return;
11007     }
11008     for (const auto &item : bundleNames) {
11009         UpateCurDynamicIconModule(item.first, item.second);
11010     }
11011 }
11012 
GetDynamicIconInfo(const std::string & bundleName,std::vector<DynamicIconInfo> & dynamicIconInfos)11013 ErrCode BundleDataMgr::GetDynamicIconInfo(const std::string &bundleName,
11014     std::vector<DynamicIconInfo> &dynamicIconInfos)
11015 {
11016     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11017     auto item = bundleInfos_.find(bundleName);
11018     if (item == bundleInfos_.end()) {
11019         APP_LOGW("bundleName: %{public}s not exist", bundleName.c_str());
11020         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11021     }
11022     item->second.GetAllDynamicIconInfo(Constants::UNSPECIFIED_USERID, dynamicIconInfos);
11023     return ERR_OK;
11024 }
11025 
GetCurDynamicIconModule(const std::string & bundleName,const int32_t userId,const int32_t appIndex)11026 std::string BundleDataMgr::GetCurDynamicIconModule(
11027     const std::string &bundleName, const int32_t userId, const int32_t appIndex)
11028 {
11029     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11030     auto item = bundleInfos_.find(bundleName);
11031     if (item == bundleInfos_.end()) {
11032         return Constants::EMPTY_STRING;
11033     }
11034     return item->second.GetCurDynamicIconModule(userId, appIndex);
11035 }
11036 
SetShortcutVisibleForSelf(const std::string & shortcutId,bool visible)11037 ErrCode BundleDataMgr::SetShortcutVisibleForSelf(const std::string &shortcutId, bool visible)
11038 {
11039     APP_LOGD("SetShortcutVisibleForSelf begin");
11040     int32_t uid = IPCSkeleton::GetCallingUid();
11041     int32_t appIndex = 0;
11042     std::string bundleName;
11043     auto ret = GetBundleNameAndIndex(uid, bundleName, appIndex);
11044     if (ret != ERR_OK) {
11045         APP_LOGE("get inner bundle info failed");
11046         return ERR_BUNDLE_MANAGER_INVALID_UID;
11047     }
11048     int32_t userId = GetUserIdByCallingUid();
11049     std::vector<ShortcutInfo> shortcutInfos;
11050     {
11051         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11052         auto iter = bundleInfos_.find(bundleName);
11053         if (iter != bundleInfos_.end()) {
11054             GetShortcutInfosByInnerBundleInfo(iter->second, shortcutInfos);
11055         } else {
11056             APP_LOGE("%{public}s not exist", bundleName.c_str());
11057             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11058         }
11059     }
11060     bool isShortcutIdExist = false;
11061     for (const auto& shortcut : shortcutInfos) {
11062         if (shortcut.id == shortcutId) {
11063             isShortcutIdExist = true;
11064         }
11065     }
11066     if (!isShortcutIdExist) {
11067         APP_LOGE("shortcut id %{public}s not exist", shortcutId.c_str());
11068         return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
11069     }
11070     if (shortcutVisibleStorage_->IsShortcutVisibleInfoExist(bundleName, shortcutId, appIndex, userId, visible)) {
11071         return ERR_OK;
11072     }
11073     if (!shortcutVisibleStorage_->SaveStorageShortcutVisibleInfo(bundleName, shortcutId, appIndex, userId, visible)) {
11074         APP_LOGE("SaveStorageShortcutVisibleInfo failed");
11075         return ERR_APPEXECFWK_DB_INSERT_ERROR;
11076     }
11077     std::shared_ptr<BundleCommonEventMgr> commonEventMgr = std::make_shared<BundleCommonEventMgr>();
11078     commonEventMgr->NotifyShortcutVisibleChanged(bundleName, shortcutId, userId, appIndex, visible);
11079     return ERR_OK;
11080 }
11081 
DeleteShortcutVisibleInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)11082 ErrCode BundleDataMgr::DeleteShortcutVisibleInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
11083 {
11084     APP_LOGD(
11085         "DeleteShortcutVisibleInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
11086         bundleName.c_str(), userId, appIndex);
11087     if (!shortcutVisibleStorage_->DeleteShortcutVisibleInfo(bundleName, userId, appIndex)) {
11088         return ERR_APPEXECFWK_DB_DELETE_ERROR;
11089     }
11090     return ERR_OK;
11091 }
11092 
GetAllShortcutInfoForSelf(std::vector<ShortcutInfo> & shortcutInfos)11093 ErrCode BundleDataMgr::GetAllShortcutInfoForSelf(std::vector<ShortcutInfo> &shortcutInfos)
11094 {
11095     APP_LOGD("GetAllShortcutInfoForSelf begin");
11096     int32_t uid = IPCSkeleton::GetCallingUid();
11097     int32_t appIndex = 0;
11098     std::string bundleName;
11099     auto ret = GetBundleNameAndIndex(uid, bundleName, appIndex);
11100     if (ret != ERR_OK) {
11101         APP_LOGE("get inner bundle info failed");
11102         return ERR_BUNDLE_MANAGER_INVALID_UID;
11103     }
11104     int32_t userId = GetUserIdByCallingUid();
11105     {
11106         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11107         auto iter = bundleInfos_.find(bundleName);
11108         if (iter != bundleInfos_.end()) {
11109             GetShortcutInfosByInnerBundleInfo(iter->second, shortcutInfos);
11110         } else {
11111             APP_LOGE("%{public}s not exist", bundleName.c_str());
11112             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11113         }
11114     }
11115     for (auto &info : shortcutInfos) {
11116         ret = shortcutVisibleStorage_->GetShortcutVisibleStatus(userId, appIndex, info);
11117         if (ret != ERR_OK) {
11118             APP_LOGD("visible not exist in table");
11119         }
11120         info.appIndex = appIndex;
11121     }
11122     return ERR_OK;
11123 }
11124 
GreatOrEqualTargetAPIVersion(const int32_t platformVersion,const int32_t minorVersion,const int32_t patchVersion)11125 bool BundleDataMgr::GreatOrEqualTargetAPIVersion(const int32_t platformVersion, const int32_t minorVersion, const int32_t patchVersion)
11126 {
11127     if (platformVersion > ServiceConstants::API_VERSION_MAX || platformVersion < 1) {
11128         APP_LOGE("GreatOrEqualTargetAPIVersion Error, platformVersion is invalid: %{public}d", platformVersion);
11129         return false;
11130     }
11131     if (minorVersion > ServiceConstants::API_VERSION_MAX || minorVersion < 0) {
11132         APP_LOGE("GreatOrEqualTargetAPIVersion Error, minorVersion is invalid: %{public}d", minorVersion);
11133         return false;
11134     }
11135     if (patchVersion > ServiceConstants::API_VERSION_MAX || patchVersion < 0) {
11136         APP_LOGE("GreatOrEqualTargetAPIVersion Error, patchVersion is invalid: %{public}d", patchVersion);
11137         return false;
11138     }
11139 
11140     BundleInfo bundleInfo;
11141     auto ret = GetBundleInfoForSelf(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_DEFAULT), bundleInfo);
11142     if (ret != ERR_OK) {
11143         APP_LOGE("GreatOrEqualTargetAPIVersion, GetBundleInfoForSelf fail");
11144         return false;
11145     }
11146 
11147     APP_LOGE("BundleDataMgr::GreatOrEqualTargetAPIVersion, name: %{public}s, major: %{public}d, minor: %{public}d, patch: %{public}d",
11148         bundleInfo.name.c_str(), (bundleInfo.targetVersion % ServiceConstants::API_VERSION_MOD),
11149         bundleInfo.targetMinorApiVersion, bundleInfo.targetPatchApiVersion);
11150     if (static_cast<uint32_t>(platformVersion) != (bundleInfo.targetVersion % ServiceConstants::API_VERSION_MOD)) {
11151         return static_cast<uint32_t>(platformVersion) < (bundleInfo.targetVersion % ServiceConstants::API_VERSION_MOD);
11152     }
11153 
11154     if (minorVersion != bundleInfo.targetMinorApiVersion) {
11155         return minorVersion < bundleInfo.targetMinorApiVersion;
11156     }
11157     return patchVersion <= bundleInfo.targetPatchApiVersion;
11158 }
11159 
GenerateUuid() const11160 std::string BundleDataMgr::GenerateUuid() const
11161 {
11162     auto currentTime = std::chrono::system_clock::now();
11163     auto timestampNanoseconds =
11164         std::chrono::duration_cast<std::chrono::nanoseconds>(currentTime.time_since_epoch()).count();
11165 
11166     // convert nanosecond timestamps to string
11167     std::string timeStr = std::to_string(timestampNanoseconds);
11168 
11169     char deviceId[UUID_LENGTH_MAX] = { 0 };
11170     auto ret = GetDevUdid(deviceId, UUID_LENGTH_MAX);
11171     std::string deviceUdid;
11172     if (ret != 0) {
11173         APP_LOGW("GetDevUdid failed");
11174     } else {
11175         deviceUdid = std::string{ deviceId };
11176     }
11177 
11178     std::string message = timeStr + deviceUdid;
11179     std::string uuid = OHOS::Security::Verify::GenerateUuidByKey(message);
11180     return uuid;
11181 }
11182 
GenerateUuidByKey(const std::string & key) const11183 std::string BundleDataMgr::GenerateUuidByKey(const std::string &key) const
11184 {
11185     char deviceId[UUID_LENGTH_MAX] = { 0 };
11186     auto ret = GetDevUdid(deviceId, UUID_LENGTH_MAX);
11187     std::string deviceUdid;
11188     if (ret != 0) {
11189         APP_LOGW("GetDevUdid failed");
11190     } else {
11191         deviceUdid = std::string{ deviceId };
11192     }
11193 
11194     std::string message = key + deviceUdid;
11195     return OHOS::Security::Verify::GenerateUuidByKey(message);
11196 }
11197 
GetAllCloneAppIndexesAndUidsByInnerBundleInfo(const int32_t userId,std::unordered_map<std::string,std::vector<std::pair<int32_t,int32_t>>> & cloneInfos) const11198 ErrCode BundleDataMgr::GetAllCloneAppIndexesAndUidsByInnerBundleInfo(const int32_t userId,
11199     std::unordered_map<std::string, std::vector<std::pair<int32_t, int32_t>>> &cloneInfos) const
11200 {
11201     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11202     if (bundleInfos_.empty()) {
11203         APP_LOGW("bundleInfos_ data is empty");
11204         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
11205     }
11206     for (const auto &item : bundleInfos_) {
11207         const InnerBundleInfo &info = item.second;
11208         std::string bundleName = item.second.GetBundleName();
11209         if (bundleName.empty()) {
11210             continue;
11211         }
11212         std::vector<int32_t> allAppIndexes = {0};
11213         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
11214         allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
11215         for (int32_t appIndex: allAppIndexes) {
11216             int32_t uid = info.GetUid(userId, appIndex);
11217             cloneInfos[bundleName].push_back({appIndex, uid});
11218         }
11219     }
11220     return ERR_OK;
11221 }
11222 
FilterShortcutJson(nlohmann::json & jsonResult)11223 void BundleDataMgr::FilterShortcutJson(nlohmann::json &jsonResult)
11224 {
11225     if (!jsonResult.is_array()) {
11226         APP_LOGE("Invalid JSON format: expected array");
11227         return;
11228     }
11229     for (auto it = jsonResult.begin(); it != jsonResult.end();) {
11230         if (!it->contains(BUNDLE_NAME) || !it->at(BUNDLE_NAME).is_string()) {
11231             it = jsonResult.erase(it);
11232             continue;
11233         }
11234         if (!it->contains(APP_INDEX) || !it->at(APP_INDEX).is_number()) {
11235             it = jsonResult.erase(it);
11236             continue;
11237         }
11238         if (!it->contains(USER_ID) || !it->at(USER_ID).is_number()) {
11239             it = jsonResult.erase(it);
11240             continue;
11241         }
11242         int32_t userId = (*it)[USER_ID].get<int>();
11243         if (userId != Constants::START_USERID) {
11244             std::string bundleName = (*it)[BUNDLE_NAME].get<std::string>();
11245             int32_t appIndex = (*it)[APP_INDEX].get<int>();
11246             APP_LOGW("userId %{public}d is not supported for clone %{public}s %{public}d",
11247                 userId, bundleName.c_str(), appIndex);
11248             it = jsonResult.erase(it);
11249             continue;
11250         }
11251         ++it;
11252     }
11253 }
11254 
UpdateDesktopShortcutInfo(const std::string & bundleName)11255 void BundleDataMgr::UpdateDesktopShortcutInfo(const std::string &bundleName)
11256 {
11257     APP_LOGD("UpdateDesktopShortcutInfo begin");
11258     std::vector<ShortcutInfo> shortcutInfos;
11259     {
11260         std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11261         auto iter = bundleInfos_.find(bundleName);
11262         if (iter != bundleInfos_.end()) {
11263             GetShortcutInfosByInnerBundleInfo(iter->second, shortcutInfos);
11264         } else {
11265             APP_LOGE("%{public}s not exist", bundleName.c_str());
11266             return;
11267         }
11268     }
11269     if (shortcutInfos.empty()) {
11270         return;
11271     }
11272     shortcutStorage_->UpdateDesktopShortcutInfo(bundleName, shortcutInfos);
11273 }
11274 
GetPluginInfo(const std::string & hostBundleName,const std::string & pluginBundleName,const int32_t userId,PluginBundleInfo & pluginBundleInfo)11275 ErrCode BundleDataMgr::GetPluginInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
11276     const int32_t userId, PluginBundleInfo &pluginBundleInfo)
11277 {
11278     APP_LOGD("start GetPluginInfo -n %{public}s -u %{public}d", hostBundleName.c_str(), userId);
11279     int32_t requestUserId = GetUserId(userId);
11280     if (requestUserId == Constants::INVALID_USERID) {
11281         APP_LOGE("invalid userid :%{public}d", userId);
11282         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
11283     }
11284     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11285     auto item = bundleInfos_.find(hostBundleName);
11286     if (item == bundleInfos_.end()) {
11287         APP_LOGE("-n %{public}s does not exist", hostBundleName.c_str());
11288         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11289     }
11290     const InnerBundleInfo &innerBundleInfo = item->second;
11291     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
11292     if (responseUserId == Constants::INVALID_USERID) {
11293         APP_LOGE("-n %{public}s is not installed in user %{public}d or 0", hostBundleName.c_str(), userId);
11294         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11295     }
11296     std::unordered_map<std::string, PluginBundleInfo> pluginInfoMap = innerBundleInfo.GetAllPluginBundleInfo();
11297     InnerBundleUserInfo innerBundleUserInfo;
11298     innerBundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo);
11299     if ((pluginInfoMap.find(pluginBundleName) == pluginInfoMap.end()) ||
11300         (innerBundleUserInfo.installedPluginSet.find(pluginBundleName) ==
11301         innerBundleUserInfo.installedPluginSet.end())) {
11302         APP_LOGE("-p %{public}s -u %{public}d not exist", pluginBundleName.c_str(), userId);
11303         return ERR_APPEXECFWK_PLUGIN_NOT_FOUND;
11304     }
11305     pluginBundleInfo = pluginInfoMap.at(pluginBundleName);
11306     return ERR_OK;
11307 }
11308 
SetBundleUserInfoRemovable(const std::string bundleName,int32_t userId,bool removable)11309 bool BundleDataMgr::SetBundleUserInfoRemovable(const std::string bundleName, int32_t userId, bool removable)
11310 {
11311     APP_LOGD("SetBundleUserInfoRemovable: %{public}s", bundleName.c_str());
11312     std::unique_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11313     auto infoItem = bundleInfos_.find(bundleName);
11314     if (infoItem == bundleInfos_.end()) {
11315         APP_LOGW("%{public}s bundle info not exist", bundleName.c_str());
11316         return false;
11317     }
11318     auto& info = bundleInfos_.at(bundleName);
11319     InnerBundleUserInfo userInfo;
11320     if (!info.GetInnerBundleUserInfo(userId, userInfo)) {
11321         LOG_W(BMS_TAG_DEFAULT, "-n %{public}s is not installed at -u %{public}d", bundleName.c_str(), userId);
11322         return false;
11323     }
11324     if (userInfo.isRemovable == removable) {
11325         APP_LOGI("-n %{public}s -u %{public}d no need to change", bundleName.c_str(), userId);
11326         return true;
11327     }
11328     userInfo.isRemovable = removable;
11329     info.AddInnerBundleUserInfo(userInfo);
11330     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
11331     if (!dataStorage_->SaveStorageBundleInfo(info)) {
11332         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
11333         return false;
11334     }
11335     return true;
11336 }
11337 
GetTestRunner(const std::string & bundleName,const std::string & moduleName,ModuleTestRunner & testRunner)11338 ErrCode BundleDataMgr::GetTestRunner(const std::string &bundleName, const std::string &moduleName,
11339     ModuleTestRunner &testRunner)
11340 {
11341     APP_LOGD("start GetTestRunner -n %{public}s -m %{public}s", bundleName.c_str(), moduleName.c_str());
11342     std::shared_lock<ffrt::shared_mutex> lock(bundleInfoMutex_);
11343     auto item = bundleInfos_.find(bundleName);
11344     if (item == bundleInfos_.end()) {
11345         APP_LOGE("-n %{public}s does not exist", bundleName.c_str());
11346         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
11347     }
11348     auto moduleInfo = item->second.GetInnerModuleInfoByModuleName(moduleName);
11349     if (!moduleInfo) {
11350         APP_LOGE("-m %{public}s is not found", moduleName.c_str());
11351         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
11352     }
11353     BundleParser bundleParser;
11354     return bundleParser.ParseTestRunner(moduleInfo->hapPath, testRunner);
11355 }
11356 }  // namespace AppExecFwk
11357 }  // namespace OHOS
11358