• 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 "account_helper.h"
27 #include "app_log_tag_wrapper.h"
28 #include "app_provision_info_manager.h"
29 #include "bms_extension_client.h"
30 #include "bundle_data_storage_rdb.h"
31 #include "preinstall_data_storage_rdb.h"
32 #include "bundle_event_callback_death_recipient.h"
33 #include "bundle_mgr_service.h"
34 #include "bundle_mgr_client.h"
35 #include "bundle_parser.h"
36 #include "bundle_permission_mgr.h"
37 #include "bundle_status_callback_death_recipient.h"
38 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
39 #include "default_app_mgr.h"
40 #endif
41 #include "hitrace_meter.h"
42 #include "inner_bundle_clone_common.h"
43 #include "installd_client.h"
44 #include "ipc_skeleton.h"
45 #ifdef GLOBAL_I18_ENABLE
46 #include "locale_config.h"
47 #include "locale_info.h"
48 #endif
49 #include "mime_type_mgr.h"
50 #include "parameters.h"
51 #include "router_map_helper.h"
52 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
53 #include "bundle_overlay_data_manager.h"
54 #endif
55 #include "bundle_extractor.h"
56 #include "scope_guard.h"
57 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
58 #include "type_descriptor.h"
59 #include "utd_client.h"
60 #endif
61 
62 #ifdef APP_DOMAIN_VERIFY_ENABLED
63 #include "app_domain_verify_mgr_client.h"
64 #endif
65 
66 #include "router_data_storage_rdb.h"
67 #include "shortcut_data_storage_rdb.h"
68 #include "system_ability_helper.h"
69 #include "ohos_account_kits.h"
70 #include "xcollie_helper.h"
71 
72 namespace OHOS {
73 namespace AppExecFwk {
74 namespace {
75 constexpr int MAX_EVENT_CALL_BACK_SIZE = 100;
76 constexpr int8_t DATA_GROUP_INDEX_START = 1;
77 constexpr int8_t UUID_LENGTH = 36;
78 constexpr int8_t PROFILE_PREFIX_LENGTH = 9;
79 constexpr const char* GLOBAL_RESOURCE_BUNDLE_NAME = "ohos.global.systemres";
80 // freeInstall action
81 constexpr const char* FREE_INSTALL_ACTION = "ohos.want.action.hapFreeInstall";
82 // share action
83 constexpr const char* SHARE_ACTION = "ohos.want.action.sendData";
84 constexpr const char* WANT_PARAM_PICKER_SUMMARY = "ability.picker.summary";
85 constexpr const char* SUMMARY_TOTAL_COUNT = "totalCount";
86 constexpr const char* WANT_PARAM_SUMMARY = "summary";
87 constexpr int8_t DEFAULT_SUMMARY_COUNT = 0;
88 // data share
89 constexpr const char* DATA_PROXY_URI_PREFIX = "datashareproxy://";
90 constexpr int8_t DATA_PROXY_URI_PREFIX_LEN = 17;
91 // profile path
92 constexpr const char* INTENT_PROFILE_PATH = "resources/base/profile/insight_intent.json";
93 constexpr const char* NETWORK_PROFILE_PATH = "resources/base/profile/network_config.json";
94 constexpr const char* ADDITION_PROFILE_PATH = "resources/base/profile/addition.json";
95 constexpr const char* UTD_SDT_PROFILE_PATH = "resources/rawfile/arkdata/utd/utd.json5";
96 constexpr const char* PKG_CONTEXT_PROFILE_PATH = "pkgContextInfo.json";
97 constexpr const char* PROFILE_PATH = "resources/base/profile/";
98 constexpr const char* PROFILE_PREFIX = "$profile:";
99 constexpr const char* JSON_SUFFIX = ".json";
100 constexpr const char* SCHEME_HTTPS = "https";
101 constexpr const char* META_DATA_SHORTCUTS_NAME = "ohos.ability.shortcuts";
102 constexpr const char* BMS_EVENT_ADDITIONAL_INFO_CHANGED = "bms.event.ADDITIONAL_INFO_CHANGED";
103 constexpr const char* ENTRY = "entry";
104 constexpr const char* CLONE_BUNDLE_PREFIX = "clone_";
105 constexpr const char* RESOURCE_STRING_PREFIX = "$string:";
106 
107 const std::map<ProfileType, const char*> PROFILE_TYPE_MAP = {
108     { ProfileType::INTENT_PROFILE, INTENT_PROFILE_PATH },
109     { ProfileType::ADDITION_PROFILE, ADDITION_PROFILE_PATH},
110     { ProfileType::NETWORK_PROFILE, NETWORK_PROFILE_PATH },
111     { ProfileType::UTD_SDT_PROFILE, UTD_SDT_PROFILE_PATH },
112     { ProfileType::PKG_CONTEXT_PROFILE, PKG_CONTEXT_PROFILE_PATH }
113 };
114 const std::string SCHEME_END = "://";
115 const std::string LINK_FEATURE = "linkFeature";
116 const std::string ATOMIC_SERVICE_DIR_PREFIX = "+auid-";
117 const std::string CLONE_APP_DIR_PREFIX = "+clone-";
118 const std::string PLUS = "+";
119 constexpr const char* PARAM_URI_SEPARATOR = ":///";
120 constexpr const char* URI_SEPARATOR = "://";
121 constexpr uint8_t PARAM_URI_SEPARATOR_LEN = 4;
122 constexpr int8_t INVALID_BUNDLEID = -1;
123 constexpr int32_t DATA_GROUP_UID_OFFSET = 100000;
124 constexpr int32_t MAX_APP_UID = 65535;
125 constexpr int8_t ONLY_ONE_USER = 1;
126 constexpr unsigned int OTA_CODE_ENCRYPTION_TIMEOUT = 4 * 60;
127 const std::string FUNCATION_HANDLE_OTA_CODE_ENCRYPTION = "BundleDataMgr::HandleOTACodeEncryption()";
128 #ifndef BUNDLE_FRAMEWORK_FREE_INSTALL
129 constexpr int APP_MGR_SERVICE_ID = 501;
130 #endif
131 }
132 
BundleDataMgr()133 BundleDataMgr::BundleDataMgr()
134 {
135     InitStateTransferMap();
136     dataStorage_ = std::make_shared<BundleDataStorageRdb>();
137     preInstallDataStorage_ = std::make_shared<PreInstallDataStorageRdb>();
138     sandboxAppHelper_ = DelayedSingleton<BundleSandboxAppHelper>::GetInstance();
139     bundleStateStorage_ = std::make_shared<BundleStateStorage>();
140     shortcutStorage_ = std::make_shared<ShortcutDataStorageRdb>();
141     routerStorage_ = std::make_shared<RouterDataStorageRdb>();
142     uninstallDataMgr_ = std::make_shared<UninstallDataMgrStorageRdb>();
143     firstInstallDataMgr_ = std::make_shared<FirstInstallDataMgrStorageRdb>();
144     baseAppUid_ = system::GetIntParameter<int32_t>("const.product.baseappid", Constants::BASE_APP_UID);
145     if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) {
146         baseAppUid_ = Constants::BASE_APP_UID;
147     }
148     APP_LOGI("BundleDataMgr instance is created");
149 }
150 
~BundleDataMgr()151 BundleDataMgr::~BundleDataMgr()
152 {
153     APP_LOGI("BundleDataMgr instance is destroyed");
154     installStates_.clear();
155     transferStates_.clear();
156     bundleInfos_.clear();
157 }
158 
LoadDataFromPersistentStorage()159 bool BundleDataMgr::LoadDataFromPersistentStorage()
160 {
161     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
162     // Judge whether bundleState json db exists.
163     // If it does not exist, create it and return the judgment result.
164     bool bundleStateDbExist = bundleStateStorage_->HasBundleUserInfoJsonDb();
165     if (!dataStorage_->LoadAllData(bundleInfos_)) {
166         APP_LOGW("LoadAllData failed");
167         return false;
168     }
169 
170     if (bundleInfos_.empty()) {
171         APP_LOGW("persistent data is empty");
172         return false;
173     }
174 
175     for (const auto &item : bundleInfos_) {
176         std::lock_guard<std::mutex> stateLock(stateMutex_);
177         installStates_.emplace(item.first, InstallState::INSTALL_SUCCESS);
178         AddAppHspBundleName(item.second.GetApplicationBundleType(), item.first);
179     }
180 
181     RestoreUidAndGid();
182     if (!bundleStateDbExist) {
183         // Compatible old bundle status in kV db
184         CompatibleOldBundleStateInKvDb();
185     } else {
186         ResetBundleStateData();
187         // Load all bundle status from json db.
188         LoadAllBundleStateDataFromJsonDb();
189     }
190 
191     SetInitialUserFlag(true);
192 
193     RestoreSandboxUidAndGid(bundleIdMap_);
194     return true;
195 }
196 
CompatibleOldBundleStateInKvDb()197 void BundleDataMgr::CompatibleOldBundleStateInKvDb()
198 {
199     for (const auto& bundleInfoItem : bundleInfos_) {
200         for (auto& innerBundleUserInfoItem : bundleInfoItem.second.GetInnerBundleUserInfos()) {
201             auto& bundleUserInfo = innerBundleUserInfoItem.second.bundleUserInfo;
202             if (bundleUserInfo.IsInitialState()) {
203                 continue;
204             }
205 
206             // save old bundle state to json db
207             bundleStateStorage_->SaveBundleStateStorage(
208                 bundleInfoItem.first, bundleUserInfo.userId, bundleUserInfo);
209         }
210     }
211 }
212 
LoadAllBundleStateDataFromJsonDb()213 void BundleDataMgr::LoadAllBundleStateDataFromJsonDb()
214 {
215     APP_LOGD("Load all bundle state start");
216     std::map<std::string, std::map<int32_t, BundleUserInfo>> bundleStateInfos;
217     if (!bundleStateStorage_->LoadAllBundleStateData(bundleStateInfos) || bundleStateInfos.empty()) {
218         APP_LOGW("Load all bundle state failed");
219         return;
220     }
221 
222     for (const auto& bundleState : bundleStateInfos) {
223         auto infoItem = bundleInfos_.find(bundleState.first);
224         if (infoItem == bundleInfos_.end()) {
225             APP_LOGW("BundleName(%{public}s) not exist in cache", bundleState.first.c_str());
226             continue;
227         }
228 
229         InnerBundleInfo& newInfo = infoItem->second;
230         for (auto& bundleUserState : bundleState.second) {
231             auto& tempUserInfo = bundleUserState.second;
232             newInfo.SetApplicationEnabled(tempUserInfo.enabled, bundleUserState.second.setEnabledCaller,
233                 bundleUserState.first);
234             for (auto& disabledAbility : tempUserInfo.disabledAbilities) {
235                 newInfo.SetAbilityEnabled("", disabledAbility, false, bundleUserState.first);
236             }
237         }
238     }
239 
240     APP_LOGD("Load all bundle state end");
241 }
242 
ResetBundleStateData()243 void BundleDataMgr::ResetBundleStateData()
244 {
245     for (auto& bundleInfoItem : bundleInfos_) {
246         bundleInfoItem.second.ResetBundleState(Constants::ALL_USERID);
247     }
248 }
249 
UpdateBundleInstallState(const std::string & bundleName,const InstallState state,const bool isKeepData)250 bool BundleDataMgr::UpdateBundleInstallState(const std::string &bundleName,
251     const InstallState state, const bool isKeepData)
252 {
253     if (bundleName.empty()) {
254         APP_LOGW("update failed: bundle name is empty");
255         return false;
256     }
257 
258     // always keep lock bundleInfoMutex_ before locking stateMutex_ to avoid deadlock
259     std::unique_lock<std::shared_mutex> lck(bundleInfoMutex_);
260     std::lock_guard<std::mutex> lock(stateMutex_);
261     auto item = installStates_.find(bundleName);
262     if (item == installStates_.end()) {
263         if (state == InstallState::INSTALL_START) {
264             installStates_.emplace(bundleName, state);
265             APP_LOGD("update succeed");
266             return true;
267         }
268         APP_LOGW("update failed: incorrect state, -n: %{public}s", bundleName.c_str());
269         return false;
270     }
271 
272     auto stateRange = transferStates_.equal_range(state);
273     for (auto previousState = stateRange.first; previousState != stateRange.second; ++previousState) {
274         if (item->second == previousState->second) {
275             APP_LOGD("update succeed, current:%{public}d, state:%{public}d",
276                 static_cast<int32_t>(previousState->second), static_cast<int32_t>(state));
277             if (IsDeleteDataState(state)) {
278                 installStates_.erase(item);
279                 DeleteBundleInfo(bundleName, state, isKeepData);
280                 return true;
281             }
282             item->second = state;
283             return true;
284         }
285     }
286     APP_LOGW_NOFUNC("UpdateBundleInstallState -n %{public}s fail current:%{public}d state:%{public}d",
287         bundleName.c_str(), static_cast<int32_t>(item->second), static_cast<int32_t>(state));
288     return false;
289 }
290 
AddInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info,bool checkStatus)291 bool BundleDataMgr::AddInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info, bool checkStatus)
292 {
293     APP_LOGD("to save info:%{public}s", info.GetBundleName().c_str());
294     if (bundleName.empty()) {
295         APP_LOGW("save info fail, empty bundle name");
296         return false;
297     }
298 
299     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
300     auto infoItem = bundleInfos_.find(bundleName);
301     if (infoItem != bundleInfos_.end()) {
302         APP_LOGW("bundleName: %{public}s : bundle info already exist", bundleName.c_str());
303         return false;
304     }
305     std::lock_guard<std::mutex> stateLock(stateMutex_);
306     auto statusItem = installStates_.find(bundleName);
307     if (statusItem == installStates_.end()) {
308         APP_LOGW("save info fail, bundleName:%{public}s is not installed", bundleName.c_str());
309         return false;
310     }
311     if (!checkStatus || statusItem->second == InstallState::INSTALL_START) {
312         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
313         if (info.GetBaseApplicationInfo().needAppDetail) {
314             AddAppDetailAbilityInfo(info);
315         }
316 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
317         if (info.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
318             InnerBundleInfo newInfo = info;
319             std::string targetBundleName = newInfo.GetTargetBundleName();
320             auto targetInfoItem = bundleInfos_.find(targetBundleName);
321             if (targetInfoItem != bundleInfos_.end()) {
322                 OverlayDataMgr::GetInstance()->UpdateExternalOverlayInfo(newInfo, info, targetInfoItem->second);
323                 // storage target bundle info
324                 dataStorage_->SaveStorageBundleInfo(targetInfoItem->second);
325             }
326         }
327         if (info.GetOverlayType() == OVERLAY_INTERNAL_BUNDLE) {
328             info.SetOverlayModuleState(info.GetCurrentModulePackage(), OverlayState::OVERLAY_INVALID,
329                 info.GetUserId());
330         }
331         if (info.GetOverlayType() == NON_OVERLAY_TYPE) {
332             // build overlay connection for external overlay
333             BuildExternalOverlayConnection(info.GetCurrentModulePackage(), info, info.GetUserId());
334         }
335 #endif
336         bundleInfos_.emplace(bundleName, info);
337         AddAppHspBundleName(info.GetApplicationBundleType(), bundleName);
338         return true;
339     }
340     return false;
341 }
342 
AddNewModuleInfo(const std::string & bundleName,const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)343 bool BundleDataMgr::AddNewModuleInfo(
344     const std::string &bundleName, const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
345 {
346     LOG_I(BMS_TAG_DEFAULT, "addInfo:%{public}s", newInfo.GetCurrentModulePackage().c_str());
347     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
348     auto infoItem = bundleInfos_.find(bundleName);
349     if (infoItem == bundleInfos_.end()) {
350         APP_LOGW("bundleName: %{public}s : bundle info not exist", bundleName.c_str());
351         return false;
352     }
353     std::lock_guard<std::mutex> stateLock(stateMutex_);
354     auto statusItem = installStates_.find(bundleName);
355     if (statusItem == installStates_.end()) {
356         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
357         return false;
358     }
359     if (statusItem->second == InstallState::UPDATING_SUCCESS) {
360         if (AddNewModuleInfo(newInfo, oldInfo)) {
361             bundleInfos_.at(bundleName) = oldInfo;
362             return true;
363         }
364     }
365     return false;
366 }
367 
UpdateBaseBundleInfoIntoOld(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)368 void BundleDataMgr::UpdateBaseBundleInfoIntoOld(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
369 {
370     oldInfo.UpdateBaseBundleInfo(newInfo.GetBaseBundleInfo(), newInfo.HasEntry());
371     oldInfo.UpdateBaseApplicationInfo(newInfo);
372     oldInfo.UpdateRemovable(newInfo.IsPreInstallApp(), newInfo.IsRemovable());
373     oldInfo.UpdateMultiAppMode(newInfo);
374     oldInfo.UpdateReleaseType(newInfo);
375     oldInfo.SetAppType(newInfo.GetAppType());
376     oldInfo.SetAppFeature(newInfo.GetAppFeature());
377 }
378 
AddNewModuleInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)379 bool BundleDataMgr::AddNewModuleInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
380 {
381     APP_LOGD("save bundle:%{public}s info", oldInfo.GetBundleName().c_str());
382     ProcessAllowedAcls(newInfo, oldInfo);
383     if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
384         UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
385     }
386     if (oldInfo.GetOldAppIds().empty()) {
387         oldInfo.AddOldAppId(oldInfo.GetAppId());
388     }
389     oldInfo.SetProvisionId(newInfo.GetProvisionId());
390     oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
391     oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
392     oldInfo.SetCertificate(newInfo.GetCertificate());
393     oldInfo.AddOldAppId(newInfo.GetAppId());
394     oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
395     oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
396     oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
397     oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
398     oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
399     oldInfo.AddModuleInfo(newInfo);
400     oldInfo.UpdateAppDetailAbilityAttrs();
401     if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
402         AddAppDetailAbilityInfo(oldInfo);
403     }
404     oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
405     oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
406     oldInfo.UpdateOdidByBundleInfo(newInfo);
407     oldInfo.SetDFXParamStatus();
408     oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
409 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
410     if ((oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) && (newInfo.GetOverlayType() != NON_OVERLAY_TYPE)) {
411         oldInfo.SetOverlayType(newInfo.GetOverlayType());
412     }
413     if (!UpdateOverlayInfo(newInfo, oldInfo)) {
414         APP_LOGD("bundleName: %{public}s : update overlay info failed", oldInfo.GetBundleName().c_str());
415         return false;
416     }
417 #endif
418     APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
419     return true;
420 }
421 
RemoveModuleInfo(const std::string & bundleName,const std::string & modulePackage,InnerBundleInfo & oldInfo,bool needSaveStorage)422 bool BundleDataMgr::RemoveModuleInfo(
423     const std::string &bundleName, const std::string &modulePackage, InnerBundleInfo &oldInfo, bool needSaveStorage)
424 {
425     APP_LOGD("remove module info:%{public}s/%{public}s", bundleName.c_str(), modulePackage.c_str());
426     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
427     auto infoItem = bundleInfos_.find(bundleName);
428     if (infoItem == bundleInfos_.end()) {
429         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
430         return false;
431     }
432     std::lock_guard<std::mutex> stateLock(stateMutex_);
433     auto statusItem = installStates_.find(bundleName);
434     if (statusItem == installStates_.end()) {
435         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
436         return false;
437     }
438     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
439         APP_LOGD("save bundle:%{public}s info", bundleName.c_str());
440 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
441         std::string targetBundleName = oldInfo.GetTargetBundleName();
442         InnerBundleInfo targetInnerBundleInfo;
443         if (bundleInfos_.find(targetBundleName) != bundleInfos_.end()) {
444             targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
445         }
446         OverlayDataMgr::GetInstance()->RemoveOverlayModuleInfo(bundleName, modulePackage, oldInfo,
447             targetInnerBundleInfo);
448         if ((oldInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) && !targetInnerBundleInfo.GetBundleName().empty()) {
449             // save target innerBundleInfo
450             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
451                 APP_LOGD("update storage success bundle:%{public}s", targetBundleName.c_str());
452                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
453             }
454         }
455         // remove target module and overlay module state will change to OVERLAY_INVALID
456         if (oldInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
457             ResetExternalOverlayModuleState(bundleName, modulePackage);
458         }
459 #endif
460         oldInfo.RemoveModuleInfo(modulePackage);
461         oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
462         if (!oldInfo.isExistedOverlayModule()) {
463             oldInfo.SetOverlayType(NON_OVERLAY_TYPE);
464         }
465         oldInfo.SetDFXParamStatus();
466         if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(oldInfo)) {
467             APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
468             return false;
469         }
470         DeleteRouterInfo(bundleName, modulePackage);
471         bundleInfos_.at(bundleName) = oldInfo;
472         APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
473     }
474     return true;
475 }
476 
UpdateUninstallBundleInfo(const std::string & bundleName,const UninstallBundleInfo & uninstallBundleInfo)477 bool BundleDataMgr::UpdateUninstallBundleInfo(const std::string &bundleName,
478     const UninstallBundleInfo &uninstallBundleInfo)
479 {
480     if (uninstallDataMgr_ == nullptr) {
481         APP_LOGE("rdbDataManager is null");
482         return false;
483     }
484     if (bundleName.empty() || uninstallBundleInfo.userInfos.empty()) {
485         APP_LOGE("param error");
486         return false;
487     }
488     UninstallBundleInfo oldUninstallBundleInfo;
489     if (uninstallDataMgr_->GetUninstallBundleInfo(bundleName, oldUninstallBundleInfo)) {
490         std::string newUser = uninstallBundleInfo.userInfos.begin()->first;
491         if (oldUninstallBundleInfo.userInfos.find(newUser) != oldUninstallBundleInfo.userInfos.end()) {
492             APP_LOGE("u %{public}s has been saved", newUser.c_str());
493             return false;
494         }
495         oldUninstallBundleInfo.userInfos[newUser] = uninstallBundleInfo.userInfos.begin()->second;
496         return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, oldUninstallBundleInfo);
497     }
498     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
499 }
500 
GetUninstallBundleInfo(const std::string & bundleName,UninstallBundleInfo & uninstallBundleInfo)501 bool BundleDataMgr::GetUninstallBundleInfo(const std::string &bundleName, UninstallBundleInfo &uninstallBundleInfo)
502 {
503     if (uninstallDataMgr_ == nullptr) {
504         APP_LOGE("rdbDataManager is null");
505         return false;
506     }
507     if (bundleName.empty()) {
508         APP_LOGE("param error");
509         return false;
510     }
511     return uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo);
512 }
513 
GetAllUninstallBundleInfo(std::map<std::string,UninstallBundleInfo> & uninstallBundleInfos)514 bool BundleDataMgr::GetAllUninstallBundleInfo(
515     std::map<std::string, UninstallBundleInfo> &uninstallBundleInfos)
516 {
517     if (uninstallDataMgr_ == nullptr) {
518         APP_LOGE("rdbDataManager is null");
519         return false;
520     }
521     return uninstallDataMgr_->GetAllUninstallBundleInfo(uninstallBundleInfos);
522 }
523 
DeleteUninstallBundleInfo(const std::string & bundleName,int32_t userId)524 bool BundleDataMgr::DeleteUninstallBundleInfo(const std::string &bundleName, int32_t userId)
525 {
526     if (uninstallDataMgr_ == nullptr) {
527         APP_LOGE("rdbDataManager is null");
528         return false;
529     }
530     if (bundleName.empty()) {
531         APP_LOGE("param error");
532         return false;
533     }
534     UninstallBundleInfo uninstallBundleInfo;
535     if (!uninstallDataMgr_->GetUninstallBundleInfo(bundleName, uninstallBundleInfo)) {
536         APP_LOGE("bundle %{public}s is not found", bundleName.c_str());
537         return false;
538     }
539     auto it = uninstallBundleInfo.userInfos.find(std::to_string(userId));
540     if (it == uninstallBundleInfo.userInfos.end()) {
541         APP_LOGE("user %{public}d is not found", userId);
542         return false;
543     }
544     uninstallBundleInfo.userInfos.erase(std::to_string(userId));
545     if (uninstallBundleInfo.userInfos.empty()) {
546         return uninstallDataMgr_->DeleteUninstallBundleInfo(bundleName);
547     }
548     return uninstallDataMgr_->UpdateUninstallBundleInfo(bundleName, uninstallBundleInfo);
549 }
550 
AddFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,const FirstInstallBundleInfo & firstInstallBundleInfo)551 bool BundleDataMgr::AddFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
552     const FirstInstallBundleInfo &firstInstallBundleInfo)
553 {
554     if (bundleName.empty()) {
555         APP_LOGE("bundleName is empty");
556         return false;
557     }
558     if (firstInstallDataMgr_ == nullptr) {
559         APP_LOGE("firstInstallDataMgr_ is null");
560         return false;
561     }
562 
563     if (firstInstallDataMgr_->IsExistFirstInstallBundleInfo(bundleName, userId)) {
564         APP_LOGW("bundleName %{public}s, user %{public}d has been saved", bundleName.c_str(), userId);
565         return true;
566     }
567     return firstInstallDataMgr_->AddFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
568 }
569 
GetFirstInstallBundleInfo(const std::string & bundleName,const int32_t userId,FirstInstallBundleInfo & firstInstallBundleInfo)570 bool BundleDataMgr::GetFirstInstallBundleInfo(const std::string &bundleName, const int32_t userId,
571     FirstInstallBundleInfo &firstInstallBundleInfo)
572 {
573     if (bundleName.empty()) {
574         APP_LOGE("bundleName is empty");
575         return false;
576     }
577     if (firstInstallDataMgr_ == nullptr) {
578         APP_LOGE("firstInstallDataMgr_ is null");
579         return false;
580     }
581     return firstInstallDataMgr_->GetFirstInstallBundleInfo(bundleName, userId, firstInstallBundleInfo);
582 }
583 
DeleteFirstInstallBundleInfo(int32_t userId)584 bool BundleDataMgr::DeleteFirstInstallBundleInfo(int32_t userId)
585 {
586     if (firstInstallDataMgr_ == nullptr) {
587         APP_LOGE("firstInstallDataMgr_ is null");
588         return false;
589     }
590     return firstInstallDataMgr_->DeleteFirstInstallBundleInfo(userId);
591 }
592 
RemoveHspModuleByVersionCode(int32_t versionCode,InnerBundleInfo & info)593 bool BundleDataMgr::RemoveHspModuleByVersionCode(int32_t versionCode, InnerBundleInfo &info)
594 {
595     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
596     std::string bundleName = info.GetBundleName();
597     auto infoItem = bundleInfos_.find(bundleName);
598     if (infoItem == bundleInfos_.end()) {
599         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
600         return false;
601     }
602     std::lock_guard<std::mutex> stateLock(stateMutex_);
603     auto statusItem = installStates_.find(bundleName);
604     if (statusItem == installStates_.end()) {
605         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
606         return false;
607     }
608     if (statusItem->second == InstallState::UNINSTALL_START || statusItem->second == InstallState::ROLL_BACK) {
609         info.DeleteHspModuleByVersion(versionCode);
610         info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
611         if (dataStorage_->SaveStorageBundleInfo(info)) {
612             APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
613             bundleInfos_.at(bundleName) = info;
614             return true;
615         }
616     }
617     return true;
618 }
619 
AddInnerBundleUserInfo(const std::string & bundleName,const InnerBundleUserInfo & newUserInfo)620 bool BundleDataMgr::AddInnerBundleUserInfo(
621     const std::string &bundleName, const InnerBundleUserInfo& newUserInfo)
622 {
623     APP_LOGD("AddInnerBundleUserInfo:%{public}s", bundleName.c_str());
624     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
625     auto infoItem = bundleInfos_.find(bundleName);
626     if (infoItem == bundleInfos_.end()) {
627         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
628         return false;
629     }
630 
631     std::lock_guard<std::mutex> stateLock(stateMutex_);
632     auto& info = bundleInfos_.at(bundleName);
633     info.AddInnerBundleUserInfo(newUserInfo);
634     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
635     if (!dataStorage_->SaveStorageBundleInfo(info)) {
636         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
637         return false;
638     }
639     return true;
640 }
641 
RemoveInnerBundleUserInfo(const std::string & bundleName,int32_t userId)642 bool BundleDataMgr::RemoveInnerBundleUserInfo(
643     const std::string &bundleName, int32_t userId)
644 {
645     APP_LOGD("RemoveInnerBundleUserInfo:%{public}s", bundleName.c_str());
646     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
647     auto infoItem = bundleInfos_.find(bundleName);
648     if (infoItem == bundleInfos_.end()) {
649         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
650         return false;
651     }
652 
653     std::lock_guard<std::mutex> stateLock(stateMutex_);
654     auto& info = bundleInfos_.at(bundleName);
655     info.RemoveInnerBundleUserInfo(userId);
656     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
657     if (!dataStorage_->SaveStorageBundleInfo(info)) {
658         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
659         return false;
660     }
661 
662     bundleStateStorage_->DeleteBundleState(bundleName, userId);
663     return true;
664 }
665 
UpdateInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)666 bool BundleDataMgr::UpdateInnerBundleInfo(
667     const std::string &bundleName, InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
668 {
669     LOG_I(BMS_TAG_DEFAULT, "updateInfo:%{public}s", bundleName.c_str());
670     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
671     auto infoItem = bundleInfos_.find(bundleName);
672     if (infoItem == bundleInfos_.end()) {
673         APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
674         return false;
675     }
676     std::lock_guard<std::mutex> stateLock(stateMutex_);
677     auto statusItem = installStates_.find(bundleName);
678     if (statusItem == installStates_.end()) {
679         APP_LOGW("save info fail, app:%{public}s is not updated", bundleName.c_str());
680         return false;
681     }
682     // ROLL_BACK and USER_CHANGE should not be here
683     if (statusItem->second == InstallState::UPDATING_SUCCESS
684         || statusItem->second == InstallState::ROLL_BACK
685         || statusItem->second == InstallState::USER_CHANGE) {
686         APP_LOGD("begin to update, bundleName : %{public}s, moduleName : %{public}s",
687             oldInfo.GetBundleName().c_str(), newInfo.GetCurrentModulePackage().c_str());
688         if (UpdateInnerBundleInfo(newInfo, oldInfo)) {
689             bundleInfos_.at(bundleName) = oldInfo;
690             APP_LOGD("update storage success bundle:%{public}s", oldInfo.GetBundleName().c_str());
691             return true;
692         }
693     }
694     return false;
695 }
696 
UpdateInnerBundleInfo(InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)697 bool BundleDataMgr::UpdateInnerBundleInfo(InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
698 {
699     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
700         oldInfo.KeepOldOverlayConnection(newInfo);
701     }
702     ProcessAllowedAcls(newInfo, oldInfo);
703     oldInfo.UpdateModuleInfo(newInfo);
704     oldInfo.SetDFXParamStatus();
705     // 1.exist entry, update entry.
706     // 2.only exist feature, update feature.
707     if (IsUpdateInnerBundleInfoSatisified(oldInfo, newInfo)) {
708         UpdateBaseBundleInfoIntoOld(newInfo, oldInfo);
709     }
710     oldInfo.SetCertificateFingerprint(newInfo.GetCertificateFingerprint());
711     if (oldInfo.GetOldAppIds().empty()) {
712         oldInfo.AddOldAppId(oldInfo.GetAppId());
713     }
714     oldInfo.AddOldAppId(newInfo.GetAppId());
715     oldInfo.SetProvisionId(newInfo.GetProvisionId());
716     oldInfo.SetAppIdentifier(newInfo.GetAppIdentifier());
717     oldInfo.SetCertificate(newInfo.GetCertificate());
718     oldInfo.SetAppPrivilegeLevel(newInfo.GetAppPrivilegeLevel());
719     oldInfo.UpdateAppDetailAbilityAttrs();
720     oldInfo.UpdateDataGroupInfos(newInfo.GetDataGroupInfos());
721     if (oldInfo.GetBaseApplicationInfo().needAppDetail) {
722         AddAppDetailAbilityInfo(oldInfo);
723     }
724     oldInfo.UpdateNativeLibAttrs(newInfo.GetBaseApplicationInfo());
725     oldInfo.UpdateArkNativeAttrs(newInfo.GetBaseApplicationInfo());
726     oldInfo.SetAsanLogPath(newInfo.GetAsanLogPath());
727     if (newInfo.GetAppCrowdtestDeadline() != Constants::INHERIT_CROWDTEST_DEADLINE) {
728         oldInfo.SetAppCrowdtestDeadline(newInfo.GetAppCrowdtestDeadline());
729     }
730     oldInfo.SetBundlePackInfo(newInfo.GetBundlePackInfo());
731     // clear apply quick fix frequency
732     oldInfo.ResetApplyQuickFixFrequency();
733     oldInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
734     oldInfo.SetIsNewVersion(newInfo.GetIsNewVersion());
735     oldInfo.SetAppProvisionMetadata(newInfo.GetAppProvisionMetadata());
736     oldInfo.UpdateOdidByBundleInfo(newInfo);
737     oldInfo.SetInstalledForAllUser(newInfo.IsInstalledForAllUser());
738 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
739     if (newInfo.GetIsNewVersion() && newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
740         if (!UpdateOverlayInfo(newInfo, oldInfo)) {
741             APP_LOGD("update overlay info failed");
742             return false;
743         }
744     }
745     if ((newInfo.GetOverlayType() != NON_OVERLAY_TYPE) && (!UpdateOverlayInfo(newInfo, oldInfo))) {
746         APP_LOGD("update overlay info failed");
747         return false;
748     }
749 #endif
750     return true;
751 }
752 
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const753 bool BundleDataMgr::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo,
754     int32_t appIndex) const
755 {
756     int32_t requestUserId = GetUserId(userId);
757     if (requestUserId == Constants::INVALID_USERID) {
758         APP_LOGE("request user id is invalid");
759         return false;
760     }
761 
762     ElementName element = want.GetElement();
763     std::string bundleName = element.GetBundleName();
764     std::string abilityName = element.GetAbilityName();
765     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfo bundleName:%{public}s abilityName:%{public}s",
766         bundleName.c_str(), abilityName.c_str());
767     // explicit query
768     if (!bundleName.empty() && !abilityName.empty()) {
769         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo, appIndex);
770         if (!ret) {
771             LOG_NOFUNC_D(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d"
772                 " -i %{public}d", bundleName.c_str(), abilityName.c_str(), userId, appIndex);
773             return false;
774         }
775         return true;
776     }
777     std::vector<AbilityInfo> abilityInfos;
778     bool ret = ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
779     if (!ret) {
780         LOG_D(BMS_TAG_QUERY,
781             "implicit queryAbilityInfos error action:%{public}s uri:%{private}s type:%{public}s",
782             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
783         return false;
784     }
785     if (abilityInfos.size() == 0) {
786         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s",
787             want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
788         return false;
789     }
790     abilityInfo = abilityInfos[0];
791     return true;
792 }
793 
GetCloneAbilityInfos(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const794 void BundleDataMgr::GetCloneAbilityInfos(std::vector<AbilityInfo> &abilityInfos,
795     const ElementName &element, int32_t flags, int32_t userId) const
796 {
797     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
798     if (cloneAppIndexes.empty()) {
799         APP_LOGI("clone app index is empty");
800         return;
801     }
802     for (int32_t appIndex: cloneAppIndexes) {
803         AbilityInfo cloneAbilityInfo;
804         bool ret = ExplicitQueryCloneAbilityInfo(element, flags, userId, appIndex, cloneAbilityInfo);
805         if (ret) {
806             abilityInfos.emplace_back(cloneAbilityInfo);
807         }
808     }
809 }
810 
GetCloneAbilityInfosV9(std::vector<AbilityInfo> & abilityInfos,const ElementName & element,int32_t flags,int32_t userId) const811 void BundleDataMgr::GetCloneAbilityInfosV9(std::vector<AbilityInfo> &abilityInfos,
812     const ElementName &element, int32_t flags, int32_t userId) const
813 {
814     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(element.GetBundleName(), userId);
815     if (cloneAppIndexes.empty()) {
816         APP_LOGI("clone app index is empty");
817         return;
818     }
819     for (int32_t appIndex: cloneAppIndexes) {
820         AbilityInfo cloneAbilityInfo;
821         ErrCode ret = ExplicitQueryCloneAbilityInfoV9(element, flags, userId, appIndex, cloneAbilityInfo);
822         if (ret == ERR_OK) {
823             abilityInfos.emplace_back(cloneAbilityInfo);
824         }
825     }
826 }
827 
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const828 bool BundleDataMgr::QueryAbilityInfos(
829     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
830 {
831     int32_t requestUserId = GetUserId(userId);
832     if (requestUserId == Constants::INVALID_USERID) {
833         APP_LOGE("request user id is invalid");
834         return false;
835     }
836 
837     ElementName element = want.GetElement();
838     std::string bundleName = element.GetBundleName();
839     std::string abilityName = element.GetAbilityName();
840     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfos bundleName:%{public}s abilityName:%{public}s",
841         bundleName.c_str(), abilityName.c_str());
842     // explicit query
843     if (!bundleName.empty() && !abilityName.empty()) {
844         AbilityInfo abilityInfo;
845         bool ret = ExplicitQueryAbilityInfo(want, flags, requestUserId, abilityInfo);
846         LOG_D(BMS_TAG_QUERY, "explicit query ret:%{public}d bundleName:%{public}s abilityName:%{public}s",
847             ret, bundleName.c_str(), abilityName.c_str());
848         if (ret) {
849             abilityInfos.emplace_back(abilityInfo);
850         }
851         // get cloneApp's abilityInfos
852         GetCloneAbilityInfos(abilityInfos, element, flags, userId);
853         if (abilityInfos.empty()) {
854             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility error -n %{public}s -a %{public}s -u %{public}d",
855                 bundleName.c_str(), abilityName.c_str(), userId);
856         }
857         return !abilityInfos.empty();
858     }
859     // implicit query
860     (void)ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos);
861     ImplicitQueryCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
862     if (abilityInfos.size() == 0) {
863         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
864             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
865             requestUserId);
866         return false;
867     }
868     return true;
869 }
870 
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const871 ErrCode BundleDataMgr::QueryAbilityInfosV9(
872     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
873 {
874     int32_t requestUserId = GetUserId(userId);
875     if (requestUserId == Constants::INVALID_USERID) {
876         APP_LOGE("request user id is invalid");
877         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
878     }
879 
880     ElementName element = want.GetElement();
881     std::string bundleName = element.GetBundleName();
882     std::string abilityName = element.GetAbilityName();
883     LOG_D(BMS_TAG_QUERY, "QueryAbilityInfosV9 bundleName:%{public}s abilityName:%{public}s",
884         bundleName.c_str(), abilityName.c_str());
885     // explicit query
886     if (!bundleName.empty() && !abilityName.empty()) {
887         AbilityInfo abilityInfo;
888         ErrCode ret = ExplicitQueryAbilityInfoV9(want, flags, requestUserId, abilityInfo);
889         LOG_D(BMS_TAG_QUERY, "explicit queryV9 ret:%{public}d, bundleName:%{public}s abilityName:%{public}s",
890             ret, bundleName.c_str(), abilityName.c_str());
891         if (ret == ERR_OK) {
892             abilityInfos.emplace_back(abilityInfo);
893         }
894         // get cloneApp's abilityInfos
895         GetCloneAbilityInfosV9(abilityInfos, element, flags, userId);
896         if (abilityInfos.empty()) {
897             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility V9 error -n %{public}s -a %{public}s -u %{public}d",
898                 bundleName.c_str(), abilityName.c_str(), userId);
899             return ret;
900         }
901         return ERR_OK;
902     }
903     // implicit query
904     ErrCode ret = ImplicitQueryAbilityInfosV9(want, flags, requestUserId, abilityInfos);
905     ImplicitQueryCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
906     if (abilityInfos.empty()) {
907         if (ret != ERR_OK) {
908             return ret;
909         }
910         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
911             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
912             requestUserId);
913         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
914     }
915     return ERR_OK;
916 }
917 
BatchQueryAbilityInfos(const std::vector<Want> & wants,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const918 ErrCode BundleDataMgr::BatchQueryAbilityInfos(
919     const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
920 {
921     int32_t requestUserId = GetUserId(userId);
922     if (requestUserId == Constants::INVALID_USERID) {
923         APP_LOGE("request user id is invalid");
924         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
925     }
926 
927     for (size_t i = 0; i < wants.size(); i++) {
928         std::vector<AbilityInfo> tmpAbilityInfos;
929         ElementName element = wants[i].GetElement();
930         std::string bundleName = element.GetBundleName();
931         std::string abilityName = element.GetAbilityName();
932         APP_LOGD("QueryAbilityInfosV9 bundle name:%{public}s, ability name:%{public}s",
933             bundleName.c_str(), abilityName.c_str());
934         // explicit query
935         if (!bundleName.empty() && !abilityName.empty()) {
936             AbilityInfo abilityInfo;
937             ErrCode ret = ExplicitQueryAbilityInfoV9(wants[i], flags, requestUserId, abilityInfo);
938             if (ret != ERR_OK) {
939                 APP_LOGE("explicit queryAbilityInfoV9 error:%{public}d, bundleName:%{public}s, abilityName:%{public}s",
940                     ret, bundleName.c_str(), abilityName.c_str());
941                 return ret;
942             }
943             tmpAbilityInfos.emplace_back(abilityInfo);
944         } else {
945             // implicit query
946             ErrCode ret = ImplicitQueryAbilityInfosV9(wants[i], flags, requestUserId, tmpAbilityInfos);
947             if (ret != ERR_OK) {
948                 APP_LOGD("implicit queryAbilityInfosV9 error. action:%{public}s, uri:%{private}s, type:%{public}s",
949                     wants[i].GetAction().c_str(), wants[i].GetUriString().c_str(), wants[i].GetType().c_str());
950                 return ret;
951             }
952         }
953         for (size_t j = 0; j < tmpAbilityInfos.size(); j++) {
954             auto it = std::find_if(abilityInfos.begin(), abilityInfos.end(),
955                 [&](const AbilityInfo& info) {
956                     return tmpAbilityInfos[j].bundleName == info.bundleName &&
957                         tmpAbilityInfos[j].moduleName == info.moduleName &&
958                         tmpAbilityInfos[j].name == info.name;
959                 });
960             if (it == abilityInfos.end()) {
961                 abilityInfos.push_back(tmpAbilityInfos[j]);
962             }
963         }
964     }
965 
966     if (abilityInfos.empty()) {
967         APP_LOGW("no matching abilityInfo");
968         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
969     }
970 
971     return ERR_OK;
972 }
973 
ExplicitQueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const974 bool BundleDataMgr::ExplicitQueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
975     AbilityInfo &abilityInfo, int32_t appIndex) const
976 {
977     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
978     ElementName element = want.GetElement();
979     std::string bundleName = element.GetBundleName();
980     std::string abilityName = element.GetAbilityName();
981     std::string moduleName = element.GetModuleName();
982     LOG_D(BMS_TAG_QUERY,
983         "ExplicitQueryAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
984         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
985     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
986 
987     int32_t requestUserId = GetUserId(userId);
988     if (requestUserId == Constants::INVALID_USERID) {
989         APP_LOGE("request user id is invalid");
990         return false;
991     }
992 
993     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
994     InnerBundleInfo innerBundleInfo;
995     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
996         LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfo failed, bundleName:%{public}s", bundleName.c_str());
997         return false;
998     }
999     // explict query from sandbox manager
1000     if (appIndex > 0) {
1001         if (sandboxAppHelper_ == nullptr) {
1002             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1003             return false;
1004         }
1005         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1006         if (ret != ERR_OK) {
1007             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1008                 ret, bundleName.c_str());
1009             return false;
1010         }
1011     }
1012 
1013     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1014     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
1015     if (!ability) {
1016         LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbility not found UIAbility -n %{public}s -m %{public}s "
1017             "-a %{public}s -u %{public}d", bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), responseUserId);
1018         return false;
1019     }
1020     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1021 }
1022 
ExplicitQueryAbilityInfoV9(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,int32_t appIndex) const1023 ErrCode BundleDataMgr::ExplicitQueryAbilityInfoV9(const Want &want, int32_t flags, int32_t userId,
1024     AbilityInfo &abilityInfo, int32_t appIndex) const
1025 {
1026     ElementName element = want.GetElement();
1027     std::string bundleName = element.GetBundleName();
1028     std::string abilityName = element.GetAbilityName();
1029     std::string moduleName = element.GetModuleName();
1030     LOG_D(BMS_TAG_QUERY,
1031         "ExplicitQueryAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
1032         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1033     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1034     int32_t requestUserId = GetUserId(userId);
1035     if (requestUserId == Constants::INVALID_USERID) {
1036         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1037     }
1038     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1039     InnerBundleInfo innerBundleInfo;
1040     if (appIndex == 0) {
1041         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
1042         if (ret != ERR_OK) {
1043             LOG_D(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
1044             return ret;
1045         }
1046     }
1047     // explict query from sandbox manager
1048     if (appIndex > 0) {
1049         if (sandboxAppHelper_ == nullptr) {
1050             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1051             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1052         }
1053         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
1054         if (ret != ERR_OK) {
1055             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d, bundleName:%{public}s",
1056                 ret, bundleName.c_str());
1057             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1058         }
1059     }
1060 
1061     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1062     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
1063     if (!ability) {
1064         LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryAbilityInfoV9 not found UIAbility -n %{public}s -m %{public}s "
1065             "-a %{public}s", bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
1066         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1067     }
1068 
1069     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo);
1070 }
1071 
FilterAbilityInfosByModuleName(const std::string & moduleName,std::vector<AbilityInfo> & abilityInfos) const1072 void BundleDataMgr::FilterAbilityInfosByModuleName(const std::string &moduleName,
1073     std::vector<AbilityInfo> &abilityInfos) const
1074 {
1075     LOG_D(BMS_TAG_QUERY, "FilterAbilityInfosByModuleName moduleName: %{public}s", moduleName.c_str());
1076     if (moduleName.empty()) {
1077         return;
1078     }
1079     for (auto iter = abilityInfos.begin(); iter != abilityInfos.end();) {
1080         if (iter->moduleName != moduleName) {
1081             iter = abilityInfos.erase(iter);
1082         } else {
1083             ++iter;
1084         }
1085     }
1086 }
1087 
ImplicitQueryCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1088 void BundleDataMgr::ImplicitQueryCloneAbilityInfos(
1089     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1090 {
1091     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfos");
1092     int32_t requestUserId = GetUserId(userId);
1093     if (requestUserId == Constants::INVALID_USERID) {
1094         return;
1095     }
1096 
1097     if (want.GetAction().empty() && want.GetEntities().empty()
1098         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1099         LOG_E(BMS_TAG_QUERY, "param invalid");
1100         return;
1101     }
1102     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1103         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1104     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1105     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1106     if (bundleInfos_.empty()) {
1107         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1108         return;
1109     }
1110     std::string bundleName = want.GetElement().GetBundleName();
1111     if (!bundleName.empty()) {
1112         // query in current bundleName
1113         if (!ImplicitQueryCurCloneAbilityInfos(want, flags, requestUserId, abilityInfos)) {
1114             return;
1115         }
1116     } else {
1117         // query all
1118         ImplicitQueryAllCloneAbilityInfos(want, flags, requestUserId, abilityInfos);
1119     }
1120     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1121     // sort by priority, descending order.
1122     if (abilityInfos.size() > 1) {
1123         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1124             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1125     }
1126     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfos");
1127 }
1128 
ImplicitQueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1129 bool BundleDataMgr::ImplicitQueryAbilityInfos(
1130     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1131 {
1132     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1133     int32_t requestUserId = GetUserId(userId);
1134     if (requestUserId == Constants::INVALID_USERID) {
1135         return false;
1136     }
1137 
1138     if (want.GetAction().empty() && want.GetEntities().empty()
1139         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1140         LOG_E(BMS_TAG_QUERY, "param invalid");
1141         return false;
1142     }
1143     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
1144         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1145     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
1146     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1147     if (bundleInfos_.empty()) {
1148         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
1149         return false;
1150     }
1151     std::string bundleName = want.GetElement().GetBundleName();
1152     if (!bundleName.empty()) {
1153         // query in current bundleName
1154         if (!ImplicitQueryCurAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex)) {
1155             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s",
1156                 bundleName.c_str());
1157             return false;
1158         }
1159     } else {
1160         // query all
1161         ImplicitQueryAllAbilityInfos(want, flags, requestUserId, abilityInfos, appIndex);
1162     }
1163     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1164     // sort by priority, descending order.
1165     if (abilityInfos.size() > 1) {
1166         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1167             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1168     }
1169     return true;
1170 }
1171 
ImplicitQueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1172 ErrCode BundleDataMgr::ImplicitQueryAbilityInfosV9(
1173     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1174 {
1175     int32_t requestUserId = GetUserId(userId);
1176     if (requestUserId == Constants::INVALID_USERID) {
1177         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1178     }
1179 
1180     if (want.GetAction().empty() && want.GetEntities().empty()
1181         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1182         LOG_E(BMS_TAG_QUERY, "param invalid");
1183         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1184     }
1185     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1186         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1187     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1188     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1189     if (bundleInfos_.empty()) {
1190         APP_LOGW("bundleInfos_ is empty");
1191         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1192     }
1193     std::string bundleName = want.GetElement().GetBundleName();
1194     if (!bundleName.empty()) {
1195         // query in current bundleName
1196         ErrCode ret = ImplicitQueryCurAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1197         if (ret != ERR_OK) {
1198             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed bundleName:%{public}s",
1199                 bundleName.c_str());
1200             return ret;
1201         }
1202     } else {
1203         // query all
1204         ImplicitQueryAllAbilityInfosV9(want, flags, requestUserId, abilityInfos, appIndex);
1205     }
1206     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1207     // sort by priority, descending order.
1208     if (abilityInfos.size() > 1) {
1209         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1210             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1211     }
1212     return ERR_OK;
1213 }
1214 
ImplicitQueryCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1215 void BundleDataMgr::ImplicitQueryCloneAbilityInfosV9(
1216     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
1217 {
1218     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCloneAbilityInfosV9");
1219     int32_t requestUserId = GetUserId(userId);
1220     if (requestUserId == Constants::INVALID_USERID) {
1221         return;
1222     }
1223     if (want.GetAction().empty() && want.GetEntities().empty()
1224         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
1225         LOG_E(BMS_TAG_QUERY, "param invalid");
1226         return;
1227     }
1228     LOG_D(BMS_TAG_QUERY, "action:%{public}s uri:%{private}s type:%{public}s",
1229         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
1230     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d", flags, userId);
1231 
1232     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1233     if (bundleInfos_.empty()) {
1234         APP_LOGW("bundleInfos_ is empty");
1235         return;
1236     }
1237     std::string bundleName = want.GetElement().GetBundleName();
1238     if (!bundleName.empty()) {
1239         // query in current bundleName
1240         if (!ImplicitQueryCurCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos)) {
1241             return;
1242         }
1243     } else {
1244         // query all
1245         ImplicitQueryAllCloneAbilityInfosV9(want, flags, requestUserId, abilityInfos);
1246     }
1247     FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
1248     // sort by priority, descending order.
1249     if (abilityInfos.size() > 1) {
1250         std::stable_sort(abilityInfos.begin(), abilityInfos.end(),
1251             [](AbilityInfo a, AbilityInfo b) { return a.priority > b.priority; });
1252     }
1253     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCloneAbilityInfosV9");
1254 }
1255 
QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1256 bool BundleDataMgr::QueryAbilityInfoWithFlags(const std::optional<AbilityInfo> &option, int32_t flags, int32_t userId,
1257     const InnerBundleInfo &innerBundleInfo, AbilityInfo &info, int32_t appIndex) const
1258 {
1259     LOG_D(BMS_TAG_QUERY,
1260         "begin to QueryAbilityInfoWithFlags flags=%{public}d,userId=%{public}d,appIndex=%{public}d",
1261         flags, userId, appIndex);
1262     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_SYSTEMAPP_ONLY) == GET_ABILITY_INFO_SYSTEMAPP_ONLY &&
1263         !innerBundleInfo.IsSystemApp()) {
1264         LOG_W(BMS_TAG_QUERY, "no system app ability info for this calling");
1265         return false;
1266     }
1267     if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE)) {
1268         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1269             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1270                 option->bundleName.c_str(), option->name.c_str());
1271             return false;
1272         }
1273     }
1274     info = (*option);
1275     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
1276         info.permissions.clear();
1277     }
1278     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
1279         info.metaData.customizeData.clear();
1280         info.metadata.clear();
1281     }
1282     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
1283         info.skills.clear();
1284     }
1285     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
1286         innerBundleInfo.GetApplicationInfo(
1287             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, info.applicationInfo);
1288     }
1289     // set uid for NAPI cache use
1290     InnerBundleUserInfo innerBundleUserInfo;
1291     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1292         if (appIndex == 0) {
1293             info.uid = innerBundleUserInfo.uid;
1294         } else {
1295             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1296             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1297                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1298                 info.uid = cloneInfo.uid;
1299                 info.appIndex = cloneInfo.appIndex;
1300             } else {
1301                 LOG_W(BMS_TAG_QUERY, "can't find cloneInfos");
1302                 return false;
1303             }
1304         }
1305     }
1306     return true;
1307 }
1308 
IsSystemApp(const std::string & bundleName,bool & isSystemApp)1309 ErrCode BundleDataMgr::IsSystemApp(const std::string &bundleName, bool &isSystemApp)
1310 {
1311     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
1312     auto bundleInfoItem = bundleInfos_.find(bundleName);
1313     if (bundleInfoItem == bundleInfos_.end()) {
1314         APP_LOGW("%{public}s not found", bundleName.c_str());
1315         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1316     }
1317     isSystemApp = bundleInfoItem->second.IsSystemApp();
1318     return ERR_OK;
1319 }
1320 
QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> & option,int32_t flags,int32_t userId,const InnerBundleInfo & innerBundleInfo,AbilityInfo & info,int32_t appIndex) const1321 ErrCode BundleDataMgr::QueryAbilityInfoWithFlagsV9(const std::optional<AbilityInfo> &option,
1322     int32_t flags, int32_t userId, const InnerBundleInfo &innerBundleInfo, AbilityInfo &info,
1323     int32_t appIndex) const
1324 {
1325     LOG_D(BMS_TAG_QUERY, "begin to QueryAbilityInfoWithFlagsV9");
1326     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1327         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP) &&
1328         !innerBundleInfo.IsSystemApp()) {
1329         LOG_W(BMS_TAG_QUERY, "target not system app");
1330         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1331     }
1332     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1333         if (!innerBundleInfo.IsAbilityEnabled((*option), userId, appIndex)) {
1334             LOG_W(BMS_TAG_QUERY, "bundleName:%{public}s ability:%{public}s is disabled",
1335                 option->bundleName.c_str(), option->name.c_str());
1336             return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
1337         }
1338     }
1339     info = (*option);
1340     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1341         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1342         info.permissions.clear();
1343     }
1344     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1345         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1346         info.metaData.customizeData.clear();
1347         info.metadata.clear();
1348     }
1349     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1350         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1351         info.skills.clear();
1352     }
1353     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1354         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1355         innerBundleInfo.GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1356             userId, info.applicationInfo, appIndex);
1357     }
1358     // set uid for NAPI cache use
1359     InnerBundleUserInfo innerBundleUserInfo;
1360     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1361         if (appIndex == 0) {
1362             info.uid = innerBundleUserInfo.uid;
1363         } else {
1364             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1365             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1366                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(appIndexKey);
1367                 info.uid = cloneInfo.uid;
1368                 info.appIndex = cloneInfo.appIndex;
1369             } else {
1370                 return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1371             }
1372         }
1373     }
1374     return ERR_OK;
1375 }
1376 
ImplicitQueryCurAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1377 bool BundleDataMgr::ImplicitQueryCurAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1378     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1379 {
1380     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfos");
1381     std::string bundleName = want.GetElement().GetBundleName();
1382     InnerBundleInfo innerBundleInfo;
1383     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
1384         LOG_W(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfos failed bundleName:%{public}s", bundleName.c_str());
1385         return false;
1386     }
1387     if (appIndex > 0) {
1388         if (sandboxAppHelper_ == nullptr) {
1389             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1390             return false;
1391         }
1392         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1393         if (ret != ERR_OK) {
1394             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode:%{public}d bundleName:%{public}s",
1395                 ret, bundleName.c_str());
1396             return false;
1397         }
1398     }
1399     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1400     std::vector<std::string> mimeTypes;
1401     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1402     GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1403     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1404     return true;
1405 }
1406 
ImplicitQueryCurCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1407 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1408     std::vector<AbilityInfo> &abilityInfos) const
1409 {
1410     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfos");
1411     std::string bundleName = want.GetElement().GetBundleName();
1412     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1413     if (cloneAppIndexes.empty()) {
1414         return false;
1415     }
1416     std::vector<std::string> mimeTypes;
1417     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1418     for (int32_t appIndex: cloneAppIndexes) {
1419         InnerBundleInfo innerBundleInfo;
1420         if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex)) {
1421             continue;
1422         }
1423         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1424 
1425         GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1426         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1427     }
1428     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfos");
1429     return true;
1430 }
1431 
ImplicitQueryCurAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1432 ErrCode BundleDataMgr::ImplicitQueryCurAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1433     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1434 {
1435     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1436     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurAbilityInfosV9");
1437     std::string bundleName = want.GetElement().GetBundleName();
1438     InnerBundleInfo innerBundleInfo;
1439     if (appIndex == 0) {
1440         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
1441         if (ret != ERR_OK) {
1442             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurAbilityInfosV9 failed, bundleName:%{public}s",
1443                 bundleName.c_str());
1444             return ret;
1445         }
1446     }
1447     if (appIndex > 0) {
1448         if (sandboxAppHelper_ == nullptr) {
1449             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1450             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1451         }
1452         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
1453         if (ret != ERR_OK) {
1454             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d bundleName:%{public}s",
1455                 ret, bundleName.c_str());
1456             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1457         }
1458     }
1459     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1460     std::vector<std::string> mimeTypes;
1461     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1462     GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1463     FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1464     return ERR_OK;
1465 }
1466 
ImplicitQueryCurCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1467 bool BundleDataMgr::ImplicitQueryCurCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1468     std::vector<AbilityInfo> &abilityInfos) const
1469 {
1470     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneAbilityInfosV9");
1471     std::string bundleName = want.GetElement().GetBundleName();
1472 
1473     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
1474     if (cloneAppIndexes.empty()) {
1475         return false;
1476     }
1477     std::vector<std::string> mimeTypes;
1478     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1479     for (int32_t appIndex: cloneAppIndexes) {
1480         InnerBundleInfo innerBundleInfo;
1481         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
1482         if (ret != ERR_OK) {
1483             LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1484                 bundleName.c_str(), appIndex);
1485             continue;
1486         }
1487         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1488         GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1489         FilterAbilityInfosByModuleName(want.GetElement().GetModuleName(), abilityInfos);
1490     }
1491     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneAbilityInfosV9");
1492     return true;
1493 }
1494 
ImplicitQueryAllAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1495 void BundleDataMgr::ImplicitQueryAllAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1496     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1497 {
1498     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfos");
1499     int32_t requestUserId = GetUserId(userId);
1500     if (requestUserId == Constants::INVALID_USERID) {
1501         LOG_W(BMS_TAG_QUERY, "invalid userId");
1502         return;
1503     }
1504     std::vector<std::string> mimeTypes;
1505     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1506     // query from bundleInfos_
1507     if (appIndex == 0) {
1508         for (const auto &item : bundleInfos_) {
1509             const InnerBundleInfo &innerBundleInfo = item.second;
1510             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1511             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
1512                 LOG_D(BMS_TAG_QUERY,
1513                     "ImplicitQueryAllAbilityInfos failed, bundleName:%{public}s, responseUserId:%{public}d",
1514                     innerBundleInfo.GetBundleName().c_str(), responseUserId);
1515                 continue;
1516             }
1517             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1518         }
1519     } else {
1520         // query from sandbox manager for sandbox bundle
1521         if (sandboxAppHelper_ == nullptr) {
1522             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1523             return;
1524         }
1525         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1526         for (const auto &item : sandboxMap) {
1527             InnerBundleInfo info;
1528             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1529             if (pos == std::string::npos) {
1530                 LOG_D(BMS_TAG_QUERY, "sandbox map contains invalid element");
1531                 continue;
1532             }
1533             std::string innerBundleName = item.first.substr(pos + 1);
1534             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1535                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1536                 continue;
1537             }
1538             int32_t responseUserId = info.GetResponseUserId(userId);
1539             GetMatchAbilityInfos(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1540         }
1541     }
1542     APP_LOGD("finish to ImplicitQueryAllAbilityInfos");
1543 }
1544 
ImplicitQueryAllCloneAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1545 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfos(const Want &want, int32_t flags, int32_t userId,
1546     std::vector<AbilityInfo> &abilityInfos) const
1547 {
1548     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfos");
1549     int32_t requestUserId = GetUserId(userId);
1550     if (requestUserId == Constants::INVALID_USERID) {
1551         LOG_W(BMS_TAG_QUERY, "invalid userId");
1552         return;
1553     }
1554     std::vector<std::string> mimeTypes;
1555     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1556     for (const auto &item : bundleInfos_) {
1557         const InnerBundleInfo &innerBundleInfo = item.second;
1558         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
1559         if (cloneAppIndexes.empty()) {
1560             continue;
1561         }
1562         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
1563         for (int32_t appIndex: cloneAppIndexes) {
1564             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
1565                 LOG_D(BMS_TAG_QUERY,
1566                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
1567                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
1568                 continue;
1569             }
1570             GetMatchAbilityInfos(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1571         }
1572     }
1573     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfos");
1574 }
1575 
ImplicitQueryAllAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,int32_t appIndex) const1576 void BundleDataMgr::ImplicitQueryAllAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1577     std::vector<AbilityInfo> &abilityInfos, int32_t appIndex) const
1578 {
1579     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1580     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllAbilityInfosV9");
1581     // query from bundleInfos_
1582     std::vector<std::string> mimeTypes;
1583     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1584     if (appIndex == 0) {
1585         for (const auto &item : bundleInfos_) {
1586             const InnerBundleInfo &innerBundleInfo = item.second;
1587             ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
1588             if (ret != ERR_OK) {
1589                 continue;
1590             }
1591 
1592             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1593             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes);
1594         }
1595     } else {
1596         // query from sandbox manager for sandbox bundle
1597         if (sandboxAppHelper_ == nullptr) {
1598             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
1599             return;
1600         }
1601         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
1602         for (const auto &item : sandboxMap) {
1603             InnerBundleInfo info;
1604             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
1605             if (pos == std::string::npos) {
1606                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
1607                 continue;
1608             }
1609             std::string innerBundleName = item.first.substr(pos + 1);
1610             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
1611                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
1612                 continue;
1613             }
1614 
1615             int32_t responseUserId = info.GetResponseUserId(userId);
1616             GetMatchAbilityInfosV9(want, flags, info, responseUserId, abilityInfos, mimeTypes);
1617         }
1618     }
1619     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllAbilityInfosV9");
1620 }
1621 
ImplicitQueryAllCloneAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const1622 void BundleDataMgr::ImplicitQueryAllCloneAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1623     std::vector<AbilityInfo> &abilityInfos) const
1624 {
1625     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryAllCloneAbilityInfosV9");
1626     std::vector<std::string> mimeTypes;
1627     MimeTypeMgr::GetMimeTypeByUri(want.GetUriString(), mimeTypes);
1628     for (const auto &item : bundleInfos_) {
1629         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(item.second.GetBundleName(), userId);
1630         if (cloneAppIndexes.empty()) {
1631             continue;
1632         }
1633         for (int32_t appIndex: cloneAppIndexes) {
1634             InnerBundleInfo innerBundleInfo;
1635             ErrCode ret = GetInnerBundleInfoWithFlagsV9(item.first, flags, innerBundleInfo, userId, appIndex);
1636             if (ret != ERR_OK) {
1637                 LOG_W(BMS_TAG_QUERY, "failed, bundleName:%{public}s, appIndex:%{public}d",
1638                     item.first.c_str(), appIndex);
1639                 continue;
1640             }
1641 
1642             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
1643             GetMatchAbilityInfosV9(want, flags, innerBundleInfo, responseUserId, abilityInfos, mimeTypes, appIndex);
1644         }
1645     }
1646     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryAllCloneAbilityInfosV9");
1647 }
1648 
CheckAbilityInfoFlagExist(int32_t flags,AbilityInfoFlag abilityInfoFlag) const1649 bool BundleDataMgr::CheckAbilityInfoFlagExist(int32_t flags, AbilityInfoFlag abilityInfoFlag) const
1650 {
1651     return (static_cast<uint32_t>(flags) & static_cast<uint32_t>(abilityInfoFlag)) == abilityInfoFlag;
1652 }
1653 
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) const1654 void BundleDataMgr::GetMatchAbilityInfos(const Want &want, int32_t flags, const InnerBundleInfo &info,
1655     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1656     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1657 {
1658     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1659     if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_SYSTEMAPP_ONLY) && !info.IsSystemApp()) {
1660         return;
1661     }
1662     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1663     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1664         bool isPrivateType = MatchPrivateType(
1665             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1666         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1667         if (skillsPair == skillInfos.end()) {
1668             continue;
1669         }
1670         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1671             const Skill &skill = skillsPair->second[skillIndex];
1672             size_t matchUriIndex = 0;
1673             if (isPrivateType || skill.Match(want, matchUriIndex)) {
1674                 AbilityInfo abilityinfo = abilityInfoPair.second;
1675                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1676                     continue;
1677                 }
1678                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_DISABLE) &&
1679                     !info.IsAbilityEnabled(abilityinfo, GetUserId(userId), appIndex)) {
1680                     LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityinfo.name.c_str());
1681                     continue;
1682                 }
1683                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_APPLICATION)) {
1684                     info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1685                         userId, abilityinfo.applicationInfo, appIndex);
1686                 }
1687                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_PERMISSION)) {
1688                     abilityinfo.permissions.clear();
1689                 }
1690                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_METADATA)) {
1691                     abilityinfo.metaData.customizeData.clear();
1692                     abilityinfo.metadata.clear();
1693                 }
1694                 if (!CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL)) {
1695                     abilityinfo.skills.clear();
1696                 }
1697                 if (CheckAbilityInfoFlagExist(flags, GET_ABILITY_INFO_WITH_SKILL_URI)) {
1698                     AddSkillUrisInfo(skillsPair->second, abilityinfo.skillUri, skillIndex, matchUriIndex);
1699                 }
1700                 abilityinfo.appIndex = appIndex;
1701                 abilityInfos.emplace_back(abilityinfo);
1702                 break;
1703             }
1704         }
1705     }
1706 }
1707 
AddSkillUrisInfo(const std::vector<Skill> & skills,std::vector<SkillUriForAbilityAndExtension> & skillUris,std::optional<size_t> matchSkillIndex,std::optional<size_t> matchUriIndex) const1708 void BundleDataMgr::AddSkillUrisInfo(const std::vector<Skill> &skills,
1709     std::vector<SkillUriForAbilityAndExtension> &skillUris,
1710     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex) const
1711 {
1712     for (size_t skillIndex = 0; skillIndex < skills.size(); ++skillIndex) {
1713         const Skill &skill = skills[skillIndex];
1714         for (size_t uriIndex = 0; uriIndex < skill.uris.size(); ++uriIndex) {
1715             const SkillUri &uri = skill.uris[uriIndex];
1716             SkillUriForAbilityAndExtension skillinfo;
1717             skillinfo.scheme = uri.scheme;
1718             skillinfo.host = uri.host;
1719             skillinfo.port = uri.port;
1720             skillinfo.path = uri.path;
1721             skillinfo.pathStartWith = uri.pathStartWith;
1722             skillinfo.pathRegex = uri.pathRegex;
1723             skillinfo.type = uri.type;
1724             skillinfo.utd = uri.utd;
1725             skillinfo.maxFileSupported = uri.maxFileSupported;
1726             skillinfo.linkFeature = uri.linkFeature;
1727             if (matchSkillIndex.has_value() && matchUriIndex.has_value() &&
1728                 skillIndex == matchSkillIndex.value() && uriIndex == matchUriIndex.value()) {
1729                 skillinfo.isMatch = true;
1730             }
1731             skillUris.emplace_back(skillinfo);
1732         }
1733     }
1734 }
1735 
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) const1736 void BundleDataMgr::EmplaceAbilityInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
1737     AbilityInfo &abilityInfo, int32_t flags, int32_t userId, std::vector<AbilityInfo> &infos,
1738     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
1739 {
1740     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(
1741         GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))) {
1742         if (!info.IsAbilityEnabled(abilityInfo, GetUserId(userId), appIndex)) {
1743             LOG_W(BMS_TAG_QUERY, "Ability %{public}s is disabled", abilityInfo.name.c_str());
1744             return;
1745         }
1746     }
1747     if ((static_cast<uint32_t>(flags) &
1748         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) ==
1749         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION)) {
1750         info.GetApplicationInfoV9(static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
1751             userId, abilityInfo.applicationInfo, appIndex);
1752     }
1753     if ((static_cast<uint32_t>(flags) &
1754         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) !=
1755         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION)) {
1756         abilityInfo.permissions.clear();
1757     }
1758     if ((static_cast<uint32_t>(flags) &
1759         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) !=
1760         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA)) {
1761         abilityInfo.metaData.customizeData.clear();
1762         abilityInfo.metadata.clear();
1763     }
1764     if ((static_cast<uint32_t>(flags) &
1765         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) !=
1766         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL)) {
1767         abilityInfo.skills.clear();
1768     }
1769     if ((static_cast<uint32_t>(flags) &
1770         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) ==
1771         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI)) {
1772         AddSkillUrisInfo(skills, abilityInfo.skillUri, matchSkillIndex, matchUriIndex);
1773     }
1774     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
1775         // set uid for NAPI cache use
1776         InnerBundleUserInfo innerBundleUserInfo;
1777         if (info.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
1778             std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex);
1779             if (innerBundleUserInfo.cloneInfos.find(appIndexKey) != innerBundleUserInfo.cloneInfos.end()) {
1780                 abilityInfo.uid = innerBundleUserInfo.cloneInfos.at(appIndexKey).uid;
1781                 abilityInfo.appIndex = innerBundleUserInfo.cloneInfos.at(appIndexKey).appIndex;
1782             }
1783         }
1784     }
1785     infos.emplace_back(abilityInfo);
1786 }
1787 
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) const1788 void BundleDataMgr::GetMatchAbilityInfosV9(const Want &want, int32_t flags, const InnerBundleInfo &info,
1789     int32_t userId, std::vector<AbilityInfo> &abilityInfos,
1790     const std::vector<std::string> &paramMimeTypes, int32_t appIndex) const
1791 {
1792     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1793     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) ==
1794         static_cast<uint32_t>((GetAbilityInfoFlag::GET_ABILITY_INFO_ONLY_SYSTEM_APP)) && !info.IsSystemApp()) {
1795         LOG_W(BMS_TAG_QUERY, "target not system app");
1796         return;
1797     }
1798     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
1799     for (const auto &abilityInfoPair : info.GetInnerAbilityInfos()) {
1800         AbilityInfo abilityinfo = abilityInfoPair.second;
1801         auto skillsPair = skillInfos.find(abilityInfoPair.first);
1802         if (skillsPair == skillInfos.end()) {
1803             continue;
1804         }
1805         bool isPrivateType = MatchPrivateType(
1806             want, abilityInfoPair.second.supportExtNames, abilityInfoPair.second.supportMimeTypes, paramMimeTypes);
1807         if (isPrivateType) {
1808             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1809                 std::nullopt, std::nullopt, appIndex);
1810             continue;
1811         }
1812         if (want.GetAction() == SHARE_ACTION) {
1813             if (!MatchShare(want, skillsPair->second)) {
1814                 continue;
1815             }
1816             EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1817                 std::nullopt, std::nullopt, appIndex);
1818             continue;
1819         }
1820         for (size_t skillIndex = 0; skillIndex < skillsPair->second.size(); ++skillIndex) {
1821             const Skill &skill = skillsPair->second[skillIndex];
1822             size_t matchUriIndex = 0;
1823             if (skill.Match(want, matchUriIndex)) {
1824                 if (abilityinfo.name == ServiceConstants::APP_DETAIL_ABILITY) {
1825                     continue;
1826                 }
1827                 EmplaceAbilityInfo(info, skillsPair->second, abilityinfo, flags, userId, abilityInfos,
1828                     skillIndex, matchUriIndex, appIndex);
1829                 break;
1830             }
1831         }
1832     }
1833 }
1834 
MatchShare(const Want & want,const std::vector<Skill> & skills) const1835 bool BundleDataMgr::MatchShare(const Want &want, const std::vector<Skill> &skills) const
1836 {
1837     if (want.GetAction() != SHARE_ACTION) {
1838         LOG_E(BMS_TAG_QUERY, "action not action");
1839         return false;
1840     }
1841     std::vector<Skill> shareActionSkills = FindSkillsContainShareAction(skills);
1842     if (shareActionSkills.empty()) {
1843         LOG_D(BMS_TAG_QUERY, "shareActionSkills is empty");
1844         return false;
1845     }
1846     auto wantParams = want.GetParams();
1847     auto pickerSummary = wantParams.GetWantParams(WANT_PARAM_PICKER_SUMMARY);
1848     int32_t totalCount = pickerSummary.GetIntParam(SUMMARY_TOTAL_COUNT, DEFAULT_SUMMARY_COUNT);
1849     if (totalCount <= DEFAULT_SUMMARY_COUNT) {
1850         LOG_W(BMS_TAG_QUERY, "Invalid total count");
1851     }
1852     auto shareSummary = pickerSummary.GetWantParams(WANT_PARAM_SUMMARY);
1853     auto utds = shareSummary.KeySet();
1854     for (auto &skill : shareActionSkills) {
1855         bool match = true;
1856         for (const auto &utd : utds) {
1857             int32_t count = shareSummary.GetIntParam(utd, DEFAULT_SUMMARY_COUNT);
1858             if (!MatchUtd(skill, utd, count)) {
1859                 match = false;
1860                 break;
1861             }
1862         }
1863         if (match) {
1864             return true;
1865         }
1866     }
1867     return false;
1868 }
1869 
MatchUtd(Skill & skill,const std::string & utd,int32_t count) const1870 bool BundleDataMgr::MatchUtd(Skill &skill, const std::string &utd, int32_t count) const
1871 {
1872     if (skill.uris.empty() || count <= DEFAULT_SUMMARY_COUNT) {
1873         LOG_W(BMS_TAG_QUERY, "skill.uris is empty or invalid utd count");
1874         return false;
1875     }
1876     bool isMatch = false;
1877     for (SkillUri &skillUri : skill.uris) {
1878         if (!skillUri.utd.empty()) {
1879             if (MatchUtd(skillUri.utd, utd)) {
1880                 skillUri.maxFileSupported -= count;
1881                 isMatch = true;
1882                 if (skillUri.maxFileSupported < 0) {
1883                     return false;
1884                 }
1885             }
1886         } else {
1887             if (MatchTypeWithUtd(skillUri.type, utd)) {
1888                 skillUri.maxFileSupported -= count;
1889                 isMatch = true;
1890                 if (skillUri.maxFileSupported < 0) {
1891                     return false;
1892                 }
1893             }
1894         }
1895     }
1896     return isMatch;
1897 }
1898 
MatchUtd(const std::string & skillUtd,const std::string & wantUtd) const1899 bool BundleDataMgr::MatchUtd(const std::string &skillUtd, const std::string &wantUtd) const
1900 {
1901 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1902     LOG_W(BMS_TAG_QUERY, "skillUtd %{public}s, wantUtd %{public}s", skillUtd.c_str(), wantUtd.c_str());
1903     std::shared_ptr<UDMF::TypeDescriptor> wantTypeDescriptor;
1904     auto ret = UDMF::UtdClient::GetInstance().GetTypeDescriptor(wantUtd, wantTypeDescriptor);
1905     if (ret != ERR_OK || wantTypeDescriptor == nullptr) {
1906         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1907         return false;
1908     }
1909     bool matchRet = false;
1910     ret = wantTypeDescriptor->BelongsTo(skillUtd, matchRet);
1911     if (ret != ERR_OK) {
1912         LOG_W(BMS_TAG_QUERY, "GetTypeDescriptor failed");
1913         return false;
1914     }
1915     return matchRet;
1916 #endif
1917     return false;
1918 }
1919 
MatchTypeWithUtd(const std::string & mimeType,const std::string & wantUtd) const1920 bool BundleDataMgr::MatchTypeWithUtd(const std::string &mimeType, const std::string &wantUtd) const
1921 {
1922 #ifdef BUNDLE_FRAMEWORK_UDMF_ENABLED
1923     LOG_W(BMS_TAG_QUERY, "mimeType %{public}s, wantUtd %{public}s", mimeType.c_str(), wantUtd.c_str());
1924     std::vector<std::string> typeUtdVector = BundleUtil::GetUtdVectorByMimeType(mimeType);
1925     for (const std::string &typeUtd : typeUtdVector) {
1926         if (MatchUtd(typeUtd, wantUtd)) {
1927             return true;
1928         }
1929     }
1930     return false;
1931 #endif
1932     return false;
1933 }
1934 
FindSkillsContainShareAction(const std::vector<Skill> & skills) const1935 std::vector<Skill> BundleDataMgr::FindSkillsContainShareAction(const std::vector<Skill> &skills) const
1936 {
1937     std::vector<Skill> shareActionSkills;
1938     for (const auto &skill : skills) {
1939         auto &actions = skill.actions;
1940         auto matchAction = std::find_if(std::begin(actions), std::end(actions), [](const auto &action) {
1941             return SHARE_ACTION == action;
1942         });
1943         if (matchAction == actions.end()) {
1944             continue;
1945         }
1946         shareActionSkills.emplace_back(skill);
1947     }
1948     return shareActionSkills;
1949 }
1950 
ModifyLauncherAbilityInfo(bool isStage,AbilityInfo & abilityInfo) const1951 void BundleDataMgr::ModifyLauncherAbilityInfo(bool isStage, AbilityInfo &abilityInfo) const
1952 {
1953     if (abilityInfo.labelId == 0) {
1954         if (isStage) {
1955             abilityInfo.labelId = abilityInfo.applicationInfo.labelId;
1956             abilityInfo.label = abilityInfo.applicationInfo.label;
1957         } else {
1958             abilityInfo.applicationInfo.label = abilityInfo.bundleName;
1959             abilityInfo.label = abilityInfo.bundleName;
1960         }
1961     }
1962 
1963     if (abilityInfo.iconId == 0) {
1964         abilityInfo.iconId = abilityInfo.applicationInfo.iconId;
1965     }
1966 }
1967 
GetMatchLauncherAbilityInfos(const Want & want,const InnerBundleInfo & info,std::vector<AbilityInfo> & abilityInfos,int64_t installTime,int32_t userId) const1968 void BundleDataMgr::GetMatchLauncherAbilityInfos(const Want& want,
1969     const InnerBundleInfo& info, std::vector<AbilityInfo>& abilityInfos,
1970     int64_t installTime, int32_t userId) const
1971 {
1972     int32_t requestUserId = GetUserId(userId);
1973     if (requestUserId == Constants::INVALID_USERID) {
1974         APP_LOGD("request user id is invalid");
1975         return;
1976     }
1977     int32_t responseUserId = info.GetResponseUserId(requestUserId);
1978     if (responseUserId == Constants::INVALID_USERID) {
1979         APP_LOGD("response user id is invalid");
1980         return;
1981     }
1982     // get clone bundle info
1983     InnerBundleUserInfo bundleUserInfo;
1984     (void)info.GetInnerBundleUserInfo(responseUserId, bundleUserInfo);
1985     if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(info.GetBundleName()) !=
1986         ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) {
1987         GetMultiLauncherAbilityInfo(want, info, bundleUserInfo, installTime, abilityInfos);
1988         return;
1989     }
1990     AbilityInfo mainAbilityInfo;
1991     info.GetMainAbilityInfo(mainAbilityInfo);
1992     if (!mainAbilityInfo.name.empty() && (mainAbilityInfo.type == AbilityType::PAGE)) {
1993         APP_LOGD("bundleName %{public}s exist mainAbility", info.GetBundleName().c_str());
1994         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
1995             responseUserId, mainAbilityInfo.applicationInfo);
1996         if (mainAbilityInfo.applicationInfo.removable && info.IsNeedSendNotify()) {
1997             mainAbilityInfo.applicationInfo.removable = info.GetUninstallState();
1998         }
1999         mainAbilityInfo.installTime = installTime;
2000         // fix labelId or iconId is equal 0
2001         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), mainAbilityInfo);
2002         abilityInfos.emplace_back(mainAbilityInfo);
2003         GetMatchLauncherAbilityInfosForCloneInfos(info, mainAbilityInfo, bundleUserInfo,
2004             abilityInfos);
2005         return;
2006     }
2007     // add app detail ability
2008     if (info.GetBaseApplicationInfo().needAppDetail) {
2009         LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s add detail ability info", info.GetBundleName().c_str());
2010         std::string moduleName = "";
2011         auto ability = info.FindAbilityInfo(moduleName, ServiceConstants::APP_DETAIL_ABILITY, responseUserId);
2012         if (!ability) {
2013             LOG_D(BMS_TAG_QUERY, "bundleName: %{public}s cant find ability", info.GetBundleName().c_str());
2014             return;
2015         }
2016         if (!info.GetIsNewVersion()) {
2017             ability->applicationInfo.label = info.GetBundleName();
2018         }
2019         ability->installTime = installTime;
2020         abilityInfos.emplace_back(*ability);
2021         GetMatchLauncherAbilityInfosForCloneInfos(info, *ability, bundleUserInfo, abilityInfos);
2022     }
2023 }
2024 
GetMultiLauncherAbilityInfo(const Want & want,const InnerBundleInfo & info,const InnerBundleUserInfo & bundleUserInfo,int64_t installTime,std::vector<AbilityInfo> & abilityInfos) const2025 void BundleDataMgr::GetMultiLauncherAbilityInfo(const Want& want,
2026     const InnerBundleInfo& info, const InnerBundleUserInfo &bundleUserInfo,
2027     int64_t installTime, std::vector<AbilityInfo>& abilityInfos) const
2028 {
2029     int32_t count = 0;
2030     std::map<std::string, std::vector<Skill>> skillInfos = info.GetInnerSkillInfos();
2031     for (const auto& abilityInfoPair : info.GetInnerAbilityInfos()) {
2032         auto skillsPair = skillInfos.find(abilityInfoPair.first);
2033         if (skillsPair == skillInfos.end()) {
2034             continue;
2035         }
2036         for (const Skill& skill : skillsPair->second) {
2037             if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) {
2038                 count++;
2039                 AbilityInfo abilityInfo = abilityInfoPair.second;
2040                 info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2041                     bundleUserInfo.bundleUserInfo.userId, abilityInfo.applicationInfo);
2042                 abilityInfo.installTime = installTime;
2043                 // fix labelId or iconId is equal 0
2044                 ModifyLauncherAbilityInfo(info.GetIsNewVersion(), abilityInfo);
2045                 abilityInfos.emplace_back(abilityInfo);
2046                 GetMatchLauncherAbilityInfosForCloneInfos(info, abilityInfoPair.second, bundleUserInfo, abilityInfos);
2047                 break;
2048             }
2049         }
2050     }
2051     APP_LOGI_NOFUNC("GetMultiLauncherAbilityInfo -n %{public}s has %{public}d launcher ability",
2052         info.GetBundleName().c_str(), count);
2053 }
2054 
GetMatchLauncherAbilityInfosForCloneInfos(const InnerBundleInfo & info,const AbilityInfo & abilityInfo,const InnerBundleUserInfo & bundleUserInfo,std::vector<AbilityInfo> & abilityInfos) const2055 void BundleDataMgr::GetMatchLauncherAbilityInfosForCloneInfos(
2056     const InnerBundleInfo& info,
2057     const AbilityInfo &abilityInfo,
2058     const InnerBundleUserInfo &bundleUserInfo,
2059     std::vector<AbilityInfo>& abilityInfos) const
2060 {
2061     for (const auto &item : bundleUserInfo.cloneInfos) {
2062         APP_LOGD("bundleName:%{public}s appIndex:%{public}d start", info.GetBundleName().c_str(), item.second.appIndex);
2063         AbilityInfo cloneAbilityInfo = abilityInfo;
2064         info.GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT,
2065             bundleUserInfo.bundleUserInfo.userId, cloneAbilityInfo.applicationInfo, item.second.appIndex);
2066         cloneAbilityInfo.installTime = item.second.installTime;
2067         cloneAbilityInfo.uid = item.second.uid;
2068         cloneAbilityInfo.appIndex = item.second.appIndex;
2069         // fix labelId or iconId is equal 0
2070         ModifyLauncherAbilityInfo(info.GetIsNewVersion(), cloneAbilityInfo);
2071         abilityInfos.emplace_back(cloneAbilityInfo);
2072     }
2073 }
2074 
ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,ApplicationInfo & applicationInfo) const2075 void BundleDataMgr::ModifyApplicationInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2076     ApplicationInfo &applicationInfo) const
2077 {
2078     applicationInfo.accessTokenId = cloneInfo.accessTokenId;
2079     applicationInfo.accessTokenIdEx = cloneInfo.accessTokenIdEx;
2080     applicationInfo.enabled = cloneInfo.enabled;
2081     applicationInfo.uid = cloneInfo.uid;
2082     applicationInfo.appIndex = cloneInfo.appIndex;
2083 }
2084 
ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo & cloneInfo,BundleInfo & bundleInfo) const2085 void BundleDataMgr::ModifyBundleInfoByCloneInfo(const InnerBundleCloneInfo &cloneInfo,
2086     BundleInfo &bundleInfo) const
2087 {
2088     bundleInfo.uid = cloneInfo.uid;
2089     bundleInfo.gid = cloneInfo.uid; // no gids, need add
2090     bundleInfo.installTime = cloneInfo.installTime;
2091     bundleInfo.appIndex = cloneInfo.appIndex;
2092     if (!bundleInfo.applicationInfo.bundleName.empty()) {
2093         ModifyApplicationInfoByCloneInfo(cloneInfo, bundleInfo.applicationInfo);
2094     }
2095 }
2096 
GetCloneBundleInfos(const InnerBundleInfo & info,int32_t flags,int32_t userId,BundleInfo & bundleInfo,std::vector<BundleInfo> & bundleInfos) const2097 void BundleDataMgr::GetCloneBundleInfos(const InnerBundleInfo& info, int32_t flags, int32_t userId,
2098     BundleInfo &bundleInfo, std::vector<BundleInfo> &bundleInfos) const
2099 {
2100     // get clone bundle info
2101     InnerBundleUserInfo bundleUserInfo;
2102     (void)info.GetInnerBundleUserInfo(userId, bundleUserInfo);
2103     if (bundleUserInfo.cloneInfos.empty()) {
2104         return;
2105     }
2106     LOG_D(BMS_TAG_QUERY, "app %{public}s start get bundle clone info",
2107         info.GetBundleName().c_str());
2108     for (const auto &item : bundleUserInfo.cloneInfos) {
2109         BundleInfo cloneBundleInfo;
2110         ErrCode ret = info.GetBundleInfoV9(flags, cloneBundleInfo, userId, item.second.appIndex);
2111         if (ret == ERR_OK) {
2112             ProcessBundleMenu(cloneBundleInfo, flags, true);
2113             ProcessBundleRouterMap(cloneBundleInfo, flags);
2114             bundleInfos.emplace_back(cloneBundleInfo);
2115         }
2116     }
2117 }
2118 
GetBundleNameAndIndexByName(const std::string & keyName,std::string & bundleName,int32_t & appIndex) const2119 void BundleDataMgr::GetBundleNameAndIndexByName(
2120     const std::string &keyName, std::string &bundleName, int32_t &appIndex) const
2121 {
2122     bundleName = keyName;
2123     appIndex = 0;
2124     // for clone bundle name
2125     auto pos = keyName.find(CLONE_BUNDLE_PREFIX);
2126     if ((pos == std::string::npos) || (pos == 0)) {
2127         return;
2128     }
2129     std::string index = keyName.substr(0, pos);
2130     if (!OHOS::StrToInt(index, appIndex)) {
2131         appIndex = 0;
2132         return;
2133     }
2134     bundleName = keyName.substr(pos + strlen(CLONE_BUNDLE_PREFIX));
2135 }
2136 
GetCloneAppIndexes(const std::string & bundleName,int32_t userId) const2137 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexes(const std::string &bundleName, int32_t userId) const
2138 {
2139     std::vector<int32_t> cloneAppIndexes;
2140     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2141     if (userId == Constants::ANY_USERID) {
2142         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2143             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2144             return cloneAppIndexes;
2145         }
2146         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2147     }
2148     int32_t requestUserId = GetUserId(userId);
2149     if (requestUserId == Constants::INVALID_USERID) {
2150         return cloneAppIndexes;
2151     }
2152     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2153     auto infoItem = bundleInfos_.find(bundleName);
2154     if (infoItem == bundleInfos_.end()) {
2155         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2156         return cloneAppIndexes;
2157     }
2158     const InnerBundleInfo &bundleInfo = infoItem->second;
2159     InnerBundleUserInfo innerBundleUserInfo;
2160     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2161         return cloneAppIndexes;
2162     }
2163     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2164     if (cloneInfos.empty()) {
2165         return cloneAppIndexes;
2166     }
2167     for (const auto &cloneInfo : cloneInfos) {
2168         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes: %{public}d", cloneInfo.second.appIndex);
2169         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2170     }
2171     return cloneAppIndexes;
2172 }
2173 
GetCloneAppIndexesNoLock(const std::string & bundleName,int32_t userId) const2174 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesNoLock(const std::string &bundleName, int32_t userId) const
2175 {
2176     std::vector<int32_t> cloneAppIndexes;
2177     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2178     if (userId == Constants::ANY_USERID) {
2179         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2180             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2181             return cloneAppIndexes;
2182         }
2183         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2184     }
2185     int32_t requestUserId = GetUserId(userId);
2186     if (requestUserId == Constants::INVALID_USERID) {
2187         return cloneAppIndexes;
2188     }
2189     auto infoItem = bundleInfos_.find(bundleName);
2190     if (infoItem == bundleInfos_.end()) {
2191         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2192         return cloneAppIndexes;
2193     }
2194     const InnerBundleInfo &bundleInfo = infoItem->second;
2195     InnerBundleUserInfo innerBundleUserInfo;
2196     if (!bundleInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
2197         return cloneAppIndexes;
2198     }
2199     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
2200     if (cloneInfos.empty()) {
2201         return cloneAppIndexes;
2202     }
2203     for (const auto &cloneInfo : cloneInfos) {
2204         LOG_I(BMS_TAG_QUERY, "get cloneAppIndexes unLock: %{public}d", cloneInfo.second.appIndex);
2205         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
2206     }
2207     return cloneAppIndexes;
2208 }
2209 
AddAppDetailAbilityInfo(InnerBundleInfo & info) const2210 void BundleDataMgr::AddAppDetailAbilityInfo(InnerBundleInfo &info) const
2211 {
2212     AbilityInfo appDetailAbility;
2213     appDetailAbility.name = ServiceConstants::APP_DETAIL_ABILITY;
2214     appDetailAbility.bundleName = info.GetBundleName();
2215     appDetailAbility.enabled = true;
2216     appDetailAbility.type = AbilityType::PAGE;
2217     appDetailAbility.isNativeAbility = true;
2218 
2219     ApplicationInfo applicationInfo = info.GetBaseApplicationInfo();
2220     appDetailAbility.applicationName = applicationInfo.name;
2221     appDetailAbility.labelId = applicationInfo.labelResource.id;
2222     if (!info.GetIsNewVersion()) {
2223         appDetailAbility.labelId = 0;
2224         appDetailAbility.label = info.GetBundleName();
2225     }
2226     appDetailAbility.iconId = applicationInfo.iconResource.id;
2227     appDetailAbility.moduleName = applicationInfo.iconResource.moduleName;
2228 
2229     if ((appDetailAbility.iconId == 0) || !info.GetIsNewVersion()) {
2230         LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo appDetailAbility.iconId is 0");
2231         // get system resource icon Id
2232         auto iter = bundleInfos_.find(GLOBAL_RESOURCE_BUNDLE_NAME);
2233         if (iter != bundleInfos_.end()) {
2234             LOG_D(BMS_TAG_QUERY, "AddAppDetailAbilityInfo get system resource iconId");
2235             appDetailAbility.iconId = iter->second.GetBaseApplicationInfo().iconId;
2236         } else {
2237             LOG_W(BMS_TAG_QUERY, "AddAppDetailAbilityInfo error: ohos.global.systemres does not exist");
2238         }
2239     }
2240     // not show in the mission list
2241     appDetailAbility.removeMissionAfterTerminate = true;
2242     // set hapPath, for label resource
2243     auto innerModuleInfo = info.GetInnerModuleInfoByModuleName(appDetailAbility.moduleName);
2244     if (innerModuleInfo) {
2245         appDetailAbility.package = innerModuleInfo->modulePackage;
2246         appDetailAbility.hapPath = innerModuleInfo->hapPath;
2247     }
2248     appDetailAbility.visible = true;
2249     std::string keyName;
2250     keyName.append(appDetailAbility.bundleName).append(".")
2251         .append(appDetailAbility.package).append(".").append(appDetailAbility.name);
2252     info.InsertAbilitiesInfo(keyName, appDetailAbility);
2253 }
2254 
GetAllLauncherAbility(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2255 void BundleDataMgr::GetAllLauncherAbility(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2256     const int32_t userId, const int32_t requestUserId) const
2257 {
2258     for (const auto &item : bundleInfos_) {
2259         const InnerBundleInfo &info = item.second;
2260         if (info.IsDisabled()) {
2261             LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2262             continue;
2263         }
2264         if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2265             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", info.GetBundleName().c_str());
2266             continue;
2267         }
2268         if (info.GetBaseBundleInfo().entryInstallationFree) {
2269             LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon",
2270                 info.GetBundleName().c_str());
2271             continue;
2272         }
2273 
2274         // get installTime from innerBundleUserInfo
2275         int64_t installTime = 0;
2276         std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2277         std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2278         auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2279             [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2280             return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2281         });
2282         if (iter != info.GetInnerBundleUserInfos().end()) {
2283             installTime = iter->second.installTime;
2284         }
2285         GetMatchLauncherAbilityInfos(want, info, abilityInfos, installTime, userId);
2286     }
2287 }
2288 
GetLauncherAbilityByBundleName(const Want & want,std::vector<AbilityInfo> & abilityInfos,const int32_t userId,const int32_t requestUserId) const2289 ErrCode BundleDataMgr::GetLauncherAbilityByBundleName(const Want &want, std::vector<AbilityInfo> &abilityInfos,
2290     const int32_t userId, const int32_t requestUserId) const
2291 {
2292     ElementName element = want.GetElement();
2293     std::string bundleName = element.GetBundleName();
2294     const auto &item = bundleInfos_.find(bundleName);
2295     if (item == bundleInfos_.end()) {
2296         LOG_W(BMS_TAG_QUERY, "no bundleName %{public}s found", bundleName.c_str());
2297         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2298     }
2299     const InnerBundleInfo &info = item->second;
2300     if(!BundlePermissionMgr::IsSystemApp()){
2301         int32_t responseUserId = info.GetResponseUserId(userId);
2302         if (responseUserId == Constants::INVALID_USERID) {
2303             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2304         }
2305     }
2306     if (info.IsDisabled()) {
2307         LOG_W(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2308         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
2309     }
2310     if (info.GetBaseApplicationInfo().hideDesktopIcon) {
2311         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) hide desktop icon", bundleName.c_str());
2312         return ERR_OK;
2313     }
2314     if (info.GetBaseBundleInfo().entryInstallationFree) {
2315         LOG_D(BMS_TAG_QUERY, "Bundle(%{public}s) is atomic service, hide desktop icon", bundleName.c_str());
2316         return ERR_OK;
2317     }
2318     // get installTime from innerBundleUserInfo
2319     int64_t installTime = 0;
2320     std::string userIdKey = info.GetBundleName() + "_" + std::to_string(userId);
2321     std::string userZeroKey = info.GetBundleName() + "_" + std::to_string(0);
2322     auto iter = std::find_if(info.GetInnerBundleUserInfos().begin(), info.GetInnerBundleUserInfos().end(),
2323         [&userIdKey, &userZeroKey](const std::pair<std::string, InnerBundleUserInfo> &infoMap) {
2324         return (infoMap.first == userIdKey || infoMap.first == userZeroKey);
2325     });
2326     if (iter != info.GetInnerBundleUserInfos().end()) {
2327         installTime = iter->second.installTime;
2328     }
2329     GetMatchLauncherAbilityInfos(want, item->second, abilityInfos, installTime, userId);
2330     FilterAbilityInfosByModuleName(element.GetModuleName(), abilityInfos);
2331     return ERR_OK;
2332 }
2333 
QueryLauncherAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos) const2334 ErrCode BundleDataMgr::QueryLauncherAbilityInfos(
2335     const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos) const
2336 {
2337     int32_t requestUserId = GetUserId(userId);
2338     if (requestUserId == Constants::INVALID_USERID) {
2339         LOG_E(BMS_TAG_QUERY, "request user id is invalid");
2340         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2341     }
2342     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2343     if (bundleInfos_.empty()) {
2344         LOG_W(BMS_TAG_QUERY, "bundleInfos_ is empty");
2345         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2346     }
2347 
2348     ElementName element = want.GetElement();
2349     std::string bundleName = element.GetBundleName();
2350     if (bundleName.empty()) {
2351         // query all launcher ability
2352         GetAllLauncherAbility(want, abilityInfos, userId, requestUserId);
2353         return ERR_OK;
2354     }
2355     // query definite abilities by bundle name
2356     ErrCode ret = GetLauncherAbilityByBundleName(want, abilityInfos, userId, requestUserId);
2357     if (ret == ERR_OK) {
2358         LOG_D(BMS_TAG_QUERY, "ability infos have been found");
2359     }
2360     return ret;
2361 }
2362 
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo) const2363 bool BundleDataMgr::QueryAbilityInfoByUri(
2364     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo) const
2365 {
2366     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2367     int32_t requestUserId = GetUserId(userId);
2368     if (requestUserId == Constants::INVALID_USERID) {
2369         return false;
2370     }
2371 
2372     if (abilityUri.empty()) {
2373         return false;
2374     }
2375     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2376         return false;
2377     }
2378     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2379     if (bundleInfos_.empty()) {
2380         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2381         return false;
2382     }
2383     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2384     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2385     if (posFirstSeparator == std::string::npos) {
2386         return false;
2387     }
2388     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2389     std::string uri;
2390     if (posSecondSeparator == std::string::npos) {
2391         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2392     } else {
2393         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2394     }
2395     for (const auto &item : bundleInfos_) {
2396         const InnerBundleInfo &info = item.second;
2397         if (info.IsDisabled()) {
2398             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2399             continue;
2400         }
2401 
2402         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2403         if (!info.GetApplicationEnabled(responseUserId)) {
2404             continue;
2405         }
2406 
2407         auto ability = info.FindAbilityInfoByUri(uri);
2408         if (!ability) {
2409             continue;
2410         }
2411 
2412         abilityInfo = (*ability);
2413         info.GetApplicationInfo(
2414             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
2415             abilityInfo.applicationInfo);
2416         return true;
2417     }
2418 
2419     LOG_W(BMS_TAG_QUERY, "query abilityUri(%{private}s) failed", abilityUri.c_str());
2420     return false;
2421 }
2422 
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)2423 bool BundleDataMgr::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
2424 {
2425     LOG_D(BMS_TAG_QUERY, "abilityUri is %{private}s", abilityUri.c_str());
2426     if (abilityUri.empty()) {
2427         return false;
2428     }
2429     if (abilityUri.find(ServiceConstants::DATA_ABILITY_URI_PREFIX) == std::string::npos) {
2430         return false;
2431     }
2432     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2433     if (bundleInfos_.empty()) {
2434         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2435         return false;
2436     }
2437     std::string noPpefixUri = abilityUri.substr(strlen(ServiceConstants::DATA_ABILITY_URI_PREFIX));
2438     auto posFirstSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR);
2439     if (posFirstSeparator == std::string::npos) {
2440         return false;
2441     }
2442     auto posSecondSeparator = noPpefixUri.find(ServiceConstants::FILE_SEPARATOR_CHAR, posFirstSeparator + 1);
2443     std::string uri;
2444     if (posSecondSeparator == std::string::npos) {
2445         uri = noPpefixUri.substr(posFirstSeparator + 1, noPpefixUri.size() - posFirstSeparator - 1);
2446     } else {
2447         uri = noPpefixUri.substr(posFirstSeparator + 1, posSecondSeparator - posFirstSeparator - 1);
2448     }
2449 
2450     for (auto &item : bundleInfos_) {
2451         InnerBundleInfo &info = item.second;
2452         if (info.IsDisabled()) {
2453             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2454             continue;
2455         }
2456         info.FindAbilityInfosByUri(uri, abilityInfos, GetUserId());
2457     }
2458     if (abilityInfos.size() == 0) {
2459         return false;
2460     }
2461 
2462     return true;
2463 }
2464 
GetApplicationInfo(const std::string & appName,int32_t flags,const int userId,ApplicationInfo & appInfo) const2465 bool BundleDataMgr::GetApplicationInfo(
2466     const std::string &appName, int32_t flags, const int userId, ApplicationInfo &appInfo) const
2467 {
2468     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2469     int32_t requestUserId = GetUserId(userId);
2470     if (requestUserId == Constants::INVALID_USERID) {
2471         return false;
2472     }
2473 
2474     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2475     InnerBundleInfo innerBundleInfo;
2476     if (!GetInnerBundleInfoWithFlags(appName, flags, innerBundleInfo, requestUserId)) {
2477         LOG_D(BMS_TAG_QUERY, "GetApplicationInfo failed, bundleName:%{public}s", appName.c_str());
2478         return false;
2479     }
2480 
2481     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2482     innerBundleInfo.GetApplicationInfo(flags, responseUserId, appInfo);
2483     return true;
2484 }
2485 
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo,const int32_t appIndex) const2486 ErrCode BundleDataMgr::GetApplicationInfoV9(
2487     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo, const int32_t appIndex) const
2488 {
2489     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2490     int32_t requestUserId = GetUserId(userId);
2491     if (requestUserId == Constants::INVALID_USERID) {
2492         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2493     }
2494 
2495     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2496     InnerBundleInfo innerBundleInfo;
2497     int32_t flag = 0;
2498     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2499         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2500         flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2501     }
2502     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId, appIndex);
2503     if (ret != ERR_OK) {
2504         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2505             appName.c_str(), requestUserId, appIndex);
2506         return ret;
2507     }
2508 
2509     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2510     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo, appIndex);
2511     if (ret != ERR_OK) {
2512         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetApplicationInfoV9 failed -n:%{public}s -u:%{public}d -i:%{public}d",
2513             appName.c_str(), responseUserId, appIndex);
2514         return ret;
2515     }
2516     return ret;
2517 }
2518 
GetApplicationInfoWithResponseId(const std::string & appName,int32_t flags,int32_t & userId,ApplicationInfo & appInfo) const2519 ErrCode BundleDataMgr::GetApplicationInfoWithResponseId(
2520     const std::string &appName, int32_t flags, int32_t &userId, ApplicationInfo &appInfo) const
2521 {
2522     int32_t requestUserId = GetUserId(userId);
2523     if (requestUserId == Constants::INVALID_USERID) {
2524         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2525     }
2526 
2527     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2528     InnerBundleInfo innerBundleInfo;
2529     int32_t flag = 0;
2530     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
2531         == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE)) {
2532         flag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
2533     }
2534     auto ret = GetInnerBundleInfoWithBundleFlagsV9(appName, flag, innerBundleInfo, requestUserId);
2535     if (ret != ERR_OK) {
2536         LOG_D(BMS_TAG_QUERY,
2537             "GetApplicationInfoV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
2538             appName.c_str(), requestUserId);
2539         return ret;
2540     }
2541 
2542     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2543     ret = innerBundleInfo.GetApplicationInfoV9(flags, responseUserId, appInfo);
2544     if (ret != ERR_OK) {
2545         LOG_D(BMS_TAG_QUERY,
2546             "GetApplicationInfoV9 failed, bundleName:%{public}s, responseUserId:%{public}d",
2547             appName.c_str(), responseUserId);
2548         return ret;
2549     }
2550     userId = responseUserId;
2551     return ret;
2552 }
2553 
GetCloneAppInfo(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2554 void BundleDataMgr::GetCloneAppInfo(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2555     std::vector<ApplicationInfo> &appInfos) const
2556 {
2557     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2558     for (int32_t appIndex : appIndexVec) {
2559         bool isEnabled = false;
2560         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2561         if (ret != ERR_OK) {
2562             continue;
2563         }
2564         if (isEnabled || (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2565             ApplicationInfo cloneAppInfo;
2566             info.GetApplicationInfo(flags, userId, cloneAppInfo, appIndex);
2567             if (cloneAppInfo.appIndex == appIndex) {
2568                 appInfos.emplace_back(cloneAppInfo);
2569             }
2570         }
2571     }
2572 }
2573 
GetApplicationInfos(int32_t flags,const int userId,std::vector<ApplicationInfo> & appInfos) const2574 bool BundleDataMgr::GetApplicationInfos(
2575     int32_t flags, const int userId, std::vector<ApplicationInfo> &appInfos) const
2576 {
2577     int32_t requestUserId = GetUserId(userId);
2578     if (requestUserId == Constants::INVALID_USERID) {
2579         return false;
2580     }
2581 
2582     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2583     if (bundleInfos_.empty()) {
2584         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
2585         return false;
2586     }
2587 
2588     for (const auto &item : bundleInfos_) {
2589         const InnerBundleInfo &info = item.second;
2590         if (info.IsDisabled()) {
2591             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
2592             continue;
2593         }
2594         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2595         if (info.GetApplicationEnabled(responseUserId) ||
2596             (static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)) {
2597             ApplicationInfo appInfo;
2598             info.GetApplicationInfo(flags, responseUserId, appInfo);
2599             appInfos.emplace_back(appInfo);
2600         }
2601         GetCloneAppInfo(info, responseUserId, flags, appInfos);
2602     }
2603     LOG_D(BMS_TAG_QUERY, "get installed bundles success");
2604     return !appInfos.empty();
2605 }
2606 
UpateExtResources(const std::string & bundleName,const std::vector<ExtendResourceInfo> & extendResourceInfos)2607 bool BundleDataMgr::UpateExtResources(const std::string &bundleName,
2608     const std::vector<ExtendResourceInfo> &extendResourceInfos)
2609 {
2610     if (bundleName.empty()) {
2611         APP_LOGW("bundleName is empty");
2612         return false;
2613     }
2614 
2615     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2616     auto infoItem = bundleInfos_.find(bundleName);
2617     if (infoItem == bundleInfos_.end()) {
2618         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2619         return false;
2620     }
2621 
2622     auto info = infoItem->second;
2623     info.AddExtendResourceInfos(extendResourceInfos);
2624     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2625         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2626         return false;
2627     }
2628 
2629     bundleInfos_.at(bundleName) = info;
2630     return true;
2631 }
2632 
RemoveExtResources(const std::string & bundleName,const std::vector<std::string> & moduleNames)2633 bool BundleDataMgr::RemoveExtResources(const std::string &bundleName,
2634     const std::vector<std::string> &moduleNames)
2635 {
2636     if (bundleName.empty()) {
2637         APP_LOGW("bundleName is empty");
2638         return false;
2639     }
2640 
2641     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2642     auto infoItem = bundleInfos_.find(bundleName);
2643     if (infoItem == bundleInfos_.end()) {
2644         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2645         return false;
2646     }
2647 
2648     auto info = infoItem->second;
2649     info.RemoveExtendResourceInfos(moduleNames);
2650     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2651         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2652         return false;
2653     }
2654 
2655     bundleInfos_.at(bundleName) = info;
2656     return true;
2657 }
2658 
UpateCurDynamicIconModule(const std::string & bundleName,const std::string & moduleName)2659 bool BundleDataMgr::UpateCurDynamicIconModule(
2660     const std::string &bundleName, const std::string &moduleName)
2661 {
2662     if (bundleName.empty()) {
2663         APP_LOGW("bundleName is empty");
2664         return false;
2665     }
2666 
2667     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
2668     auto infoItem = bundleInfos_.find(bundleName);
2669     if (infoItem == bundleInfos_.end()) {
2670         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
2671         return false;
2672     }
2673 
2674     auto info = infoItem->second;
2675     info.SetCurDynamicIconModule(moduleName);
2676     if (!dataStorage_->SaveStorageBundleInfo(info)) {
2677         APP_LOGW("SaveStorageBundleInfo failed %{public}s", bundleName.c_str());
2678         return false;
2679     }
2680 
2681     bundleInfos_.at(bundleName) = info;
2682     return true;
2683 }
2684 
GetCloneAppInfoV9(const InnerBundleInfo & info,int32_t userId,int32_t flags,std::vector<ApplicationInfo> & appInfos) const2685 void BundleDataMgr::GetCloneAppInfoV9(const InnerBundleInfo &info, int32_t userId, int32_t flags,
2686     std::vector<ApplicationInfo> &appInfos) const
2687 {
2688     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(info.GetBundleName(), userId);
2689     for (int32_t appIndex : appIndexVec) {
2690         bool isEnabled = false;
2691         ErrCode ret = info.GetApplicationEnabledV9(userId, isEnabled, appIndex);
2692         if (ret != ERR_OK) {
2693             continue;
2694         }
2695         if (isEnabled || (static_cast<uint32_t>(flags) &
2696             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2697             ApplicationInfo cloneAppInfo;
2698             ret = info.GetApplicationInfoV9(flags, userId, cloneAppInfo, appIndex);
2699             if (ret == ERR_OK) {
2700                 appInfos.emplace_back(cloneAppInfo);
2701             }
2702         }
2703     }
2704 }
2705 
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos) const2706 ErrCode BundleDataMgr::GetApplicationInfosV9(
2707     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos) const
2708 {
2709     int32_t requestUserId = GetUserId(userId);
2710     if (requestUserId == Constants::INVALID_USERID) {
2711         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2712     }
2713 
2714     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2715     if (bundleInfos_.empty()) {
2716         APP_LOGW("bundleInfos_ data is empty");
2717         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2718     }
2719     for (const auto &item : bundleInfos_) {
2720         const InnerBundleInfo &info = item.second;
2721         if (info.IsDisabled()) {
2722             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
2723             continue;
2724         }
2725         int32_t responseUserId = info.GetResponseUserId(requestUserId);
2726         if (info.GetApplicationEnabled(responseUserId) ||
2727             (static_cast<uint32_t>(flags) &
2728             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
2729             ApplicationInfo appInfo;
2730             if (info.GetApplicationInfoV9(flags, responseUserId, appInfo) == ERR_OK) {
2731                 appInfos.emplace_back(appInfo);
2732             }
2733         }
2734         GetCloneAppInfoV9(info, responseUserId, flags, appInfos);
2735     }
2736     APP_LOGD("get installed bundles success");
2737     return ERR_OK;
2738 }
2739 
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId) const2740 bool BundleDataMgr::GetBundleInfo(
2741     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId) const
2742 {
2743     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2744     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2745     if (userId == Constants::ANY_USERID) {
2746         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2747             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2748             return false;
2749         }
2750         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2751     }
2752 
2753     int32_t requestUserId = GetUserId(userId);
2754     if (requestUserId == Constants::INVALID_USERID) {
2755         return false;
2756     }
2757     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2758     InnerBundleInfo innerBundleInfo;
2759     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
2760         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d",
2761             bundleName.c_str(), requestUserId);
2762         return false;
2763     }
2764     // for only one user, bundle info can not be obtained during installation
2765     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2766         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2767         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2768             bundleName.c_str(), requestUserId);
2769         return false;
2770     }
2771 
2772     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2773     innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId);
2774 
2775     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU) == BundleFlag::GET_BUNDLE_WITH_MENU) {
2776         ProcessBundleMenu(bundleInfo, flags, false);
2777     }
2778     if ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) ==
2779         BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP) {
2780         ProcessBundleRouterMap(bundleInfo, static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
2781             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP));
2782     }
2783     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2784         bundleName.c_str(), userId);
2785     return true;
2786 }
2787 
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId,int32_t appIndex) const2788 ErrCode BundleDataMgr::GetBundleInfoV9(
2789     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const
2790 {
2791     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2792 
2793     if (userId == Constants::ANY_USERID) {
2794         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
2795         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
2796             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
2797             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2798         }
2799         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
2800     }
2801 
2802     int32_t requestUserId = GetUserId(userId);
2803     if (requestUserId == Constants::INVALID_USERID) {
2804         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
2805     }
2806 
2807     int32_t originalUserId = requestUserId;
2808     PreProcessAnyUserFlag(bundleName, flags, requestUserId);
2809     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2810     InnerBundleInfo innerBundleInfo;
2811 
2812     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
2813     if (ret != ERR_OK) {
2814         LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9 failed, error code: %{public}d, bundleName:%{public}s",
2815             ret, bundleName.c_str());
2816         return ret;
2817     }
2818     // for only one user, bundle info can not be obtained during installation
2819     if ((innerBundleInfo.GetInnerBundleUserInfos().size() <= ONLY_ONE_USER) &&
2820         (innerBundleInfo.GetInstallMark().status == InstallExceptionStatus::INSTALL_START)) {
2821         LOG_NOFUNC_W(BMS_TAG_QUERY, "GetBundleInfo failed -n %{public}s -u %{public}d, not ready",
2822             bundleName.c_str(), requestUserId);
2823         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2824     }
2825 
2826     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
2827     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
2828     PostProcessAnyUserFlags(flags, responseUserId, originalUserId, bundleInfo, innerBundleInfo);
2829 
2830     ProcessBundleMenu(bundleInfo, flags, true);
2831     ProcessBundleRouterMap(bundleInfo, flags);
2832     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
2833         bundleName.c_str(), userId);
2834     return ERR_OK;
2835 }
2836 
BatchGetBundleInfo(const std::vector<std::string> & bundleNames,int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const2837 void BundleDataMgr::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
2838     std::vector<BundleInfo> &bundleInfos, int32_t userId) const
2839 {
2840     for (const auto &bundleName : bundleNames) {
2841         BundleInfo bundleInfo;
2842         ErrCode ret = GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
2843         if (ret != ERR_OK) {
2844             continue;
2845         }
2846         bundleInfos.push_back(bundleInfo);
2847     }
2848 }
2849 
GetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)2850 ErrCode BundleDataMgr::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
2851 {
2852     int32_t uid = IPCSkeleton::GetCallingUid();
2853     int32_t appIndex = 0;
2854     InnerBundleInfo innerBundleInfo;
2855     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
2856         if (sandboxAppHelper_ == nullptr) {
2857             LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
2858             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2859         }
2860         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
2861             LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
2862             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2863         }
2864     }
2865     int32_t userId = uid / Constants::BASE_USER_RANGE;
2866     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, userId, appIndex);
2867     ProcessBundleMenu(bundleInfo, flags, true);
2868     ProcessBundleRouterMap(bundleInfo, flags);
2869     LOG_D(BMS_TAG_QUERY, "get bundleInfoForSelf %{public}s successfully in user %{public}d",
2870         innerBundleInfo.GetBundleName().c_str(), userId);
2871     return ERR_OK;
2872 }
2873 
ProcessBundleMenu(BundleInfo & bundleInfo,int32_t flags,bool clearData) const2874 ErrCode BundleDataMgr::ProcessBundleMenu(BundleInfo &bundleInfo, int32_t flags, bool clearData) const
2875 {
2876     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2877     if (clearData) {
2878         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2879             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2880             return ERR_OK;
2881         }
2882         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU))
2883             != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_MENU)) {
2884             APP_LOGD("no GET_BUNDLE_INFO_WITH_MENU flag, remove menu content");
2885             std::for_each(bundleInfo.hapModuleInfos.begin(), bundleInfo.hapModuleInfos.end(), [](auto &hapModuleInfo) {
2886                 hapModuleInfo.fileContextMenu = Constants::EMPTY_STRING;
2887             });
2888             return ERR_OK;
2889         }
2890     }
2891     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2892         std::string menuProfile = hapModuleInfo.fileContextMenu;
2893         auto pos = menuProfile.find(PROFILE_PREFIX);
2894         if (pos == std::string::npos) {
2895             APP_LOGD("invalid menu profile");
2896             continue;
2897         }
2898         std::string menuFileName = menuProfile.substr(pos + PROFILE_PREFIX_LENGTH);
2899         std::string menuFilePath = PROFILE_PATH + menuFileName + JSON_SUFFIX;
2900 
2901         std::string menuProfileContent;
2902         GetJsonProfileByExtractor(hapModuleInfo.hapPath, menuFilePath, menuProfileContent);
2903         hapModuleInfo.fileContextMenu = menuProfileContent;
2904     }
2905     return ERR_OK;
2906 }
2907 
ProcessBundleRouterMap(BundleInfo & bundleInfo,int32_t flag) const2908 void BundleDataMgr::ProcessBundleRouterMap(BundleInfo& bundleInfo, int32_t flag) const
2909 {
2910     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2911     if (routerStorage_ == nullptr) {
2912         APP_LOGE("routerStorage_ is null");
2913         return;
2914     }
2915     APP_LOGD("ProcessBundleRouterMap with flags: %{public}d", flag);
2916     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE))
2917         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) {
2918         return;
2919     }
2920     if ((static_cast<uint32_t>(flag) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP))
2921         != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ROUTER_MAP)) {
2922         return;
2923     }
2924     for (auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
2925         std::string routerPath = hapModuleInfo.routerMap;
2926         auto pos = routerPath.find(PROFILE_PREFIX);
2927         if (pos == std::string::npos) {
2928             APP_LOGD("invalid router profile");
2929             continue;
2930         }
2931         if (!routerStorage_->GetRouterInfo(bundleInfo.name, hapModuleInfo.moduleName, hapModuleInfo.routerArray)) {
2932             APP_LOGE("get failed for %{public}s", hapModuleInfo.moduleName.c_str());
2933             continue;
2934         }
2935     }
2936     RouterMapHelper::MergeRouter(bundleInfo);
2937 }
2938 
DeleteRouterInfo(const std::string & bundleName,const std::string & moduleName)2939 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName, const std::string &moduleName)
2940 {
2941     if (routerStorage_ == nullptr) {
2942         APP_LOGE("routerStorage_ is null");
2943         return false;
2944     }
2945     return routerStorage_->DeleteRouterInfo(bundleName, moduleName);
2946 }
2947 
DeleteRouterInfo(const std::string & bundleName)2948 bool BundleDataMgr::DeleteRouterInfo(const std::string &bundleName)
2949 {
2950     if (routerStorage_ == nullptr) {
2951         APP_LOGE("routerStorage_ is null");
2952         return false;
2953     }
2954     return routerStorage_->DeleteRouterInfo(bundleName);
2955 }
2956 
UpdateRouterInfo(const std::string & bundleName)2957 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName)
2958 {
2959     if (routerStorage_ == nullptr) {
2960         APP_LOGE("routerStorage_ is null");
2961         return;
2962     }
2963     std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
2964     {
2965         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
2966         const auto infoItem = bundleInfos_.find(bundleName);
2967         if (infoItem == bundleInfos_.end()) {
2968             APP_LOGW("bundleName: %{public}s bundle info not exist", bundleName.c_str());
2969             return;
2970         }
2971         FindRouterHapPath(infoItem->second, hapPathMap);
2972     }
2973     UpdateRouterInfo(bundleName, hapPathMap);
2974 }
2975 
FindRouterHapPath(const InnerBundleInfo & innerBundleInfo,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)2976 void BundleDataMgr::FindRouterHapPath(const InnerBundleInfo &innerBundleInfo,
2977     std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
2978 {
2979     auto moduleMap = innerBundleInfo.GetInnerModuleInfos();
2980     for (auto it = moduleMap.begin(); it != moduleMap.end(); it++) {
2981         std::string routerPath = it->second.routerMap;
2982         auto pos = routerPath.find(PROFILE_PREFIX);
2983         if (pos == std::string::npos) {
2984             continue;
2985         }
2986         std::string routerJsonName = routerPath.substr(pos + PROFILE_PREFIX_LENGTH);
2987         std::string routerJsonPath = PROFILE_PATH + routerJsonName + JSON_SUFFIX;
2988         hapPathMap[it->second.moduleName] = std::make_pair(it->second.hapPath, routerJsonPath);
2989     }
2990 }
2991 
UpdateRouterInfo(InnerBundleInfo & innerBundleInfo)2992 void BundleDataMgr::UpdateRouterInfo(InnerBundleInfo &innerBundleInfo)
2993 {
2994     std::map<std::string, std::pair<std::string, std::string>> hapPathMap;
2995     FindRouterHapPath(innerBundleInfo, hapPathMap);
2996     UpdateRouterInfo(innerBundleInfo.GetBundleName(), hapPathMap);
2997 }
2998 
UpdateRouterInfo(const std::string & bundleName,std::map<std::string,std::pair<std::string,std::string>> & hapPathMap)2999 void BundleDataMgr::UpdateRouterInfo(const std::string &bundleName,
3000     std::map<std::string, std::pair<std::string, std::string>> &hapPathMap)
3001 {
3002     std::map<std::string, std::string> routerInfoMap;
3003     for (auto hapIter = hapPathMap.begin(); hapIter != hapPathMap.end(); hapIter++) {
3004         std::string routerMapString;
3005         if (GetJsonProfileByExtractor(hapIter->second.first, hapIter->second.second, routerMapString) != ERR_OK) {
3006             APP_LOGW("get json string from %{public}s failed", hapIter->second.second.c_str());
3007             continue;
3008         }
3009         routerInfoMap[hapIter->first] = routerMapString;
3010     }
3011     if (!routerStorage_->UpdateRouterInfo(bundleName, routerInfoMap)) {
3012         APP_LOGW("add router for %{public}s failed", bundleName.c_str());
3013     }
3014 }
3015 
GetAllBundleNames(std::set<std::string> & bundleNames)3016 void BundleDataMgr::GetAllBundleNames(std::set<std::string> &bundleNames)
3017 {
3018     if (routerStorage_ == nullptr) {
3019         APP_LOGE("routerStorage_ is null");
3020         return;
3021     }
3022     return routerStorage_->GetAllBundleNames(bundleNames);
3023 }
3024 
PreProcessAnyUserFlag(const std::string & bundleName,int32_t & flags,int32_t & userId) const3025 void BundleDataMgr::PreProcessAnyUserFlag(const std::string &bundleName, int32_t& flags, int32_t &userId) const
3026 {
3027     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0) {
3028         flags = static_cast<uint32_t>(
3029             static_cast<uint32_t>(flags) | static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE));
3030         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
3031         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
3032             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
3033             return;
3034         }
3035         if (innerBundleUserInfos.empty()) {
3036             return;
3037         }
3038         for (auto &bundleUserInfo: innerBundleUserInfos) {
3039             if (bundleUserInfo.bundleUserInfo.userId == userId) {
3040                 return;
3041             }
3042             if (bundleUserInfo.bundleUserInfo.userId < Constants::START_USERID) {
3043                 return;
3044             }
3045         }
3046         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
3047     }
3048 }
3049 
PostProcessAnyUserFlags(int32_t flags,int32_t userId,int32_t originalUserId,BundleInfo & bundleInfo,const InnerBundleInfo & innerBundleInfo) const3050 void BundleDataMgr::PostProcessAnyUserFlags(
3051     int32_t flags, int32_t userId, int32_t originalUserId, BundleInfo &bundleInfo,
3052     const InnerBundleInfo &innerBundleInfo) const
3053 {
3054     bool withApplicationFlag =
3055         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION))
3056             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
3057     if (withApplicationFlag) {
3058         if (userId >= Constants::START_USERID && userId != originalUserId) {
3059             uint32_t flagInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_INSTALLED);
3060             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3061             if ((applicationFlags & flagInstalled) != 0) {
3062                 bundleInfo.applicationInfo.applicationFlags = static_cast<int32_t>(applicationFlags ^ flagInstalled);
3063             }
3064         }
3065 
3066         bool withAnyUser =
3067             (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER))
3068                 == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER);
3069         if (withAnyUser) {
3070             const std::map<std::string, InnerBundleUserInfo>& innerUserInfos
3071                 = innerBundleInfo.GetInnerBundleUserInfos();
3072             uint32_t flagOtherInstalled = static_cast<uint32_t>(ApplicationInfoFlag::FLAG_OTHER_INSTALLED);
3073             uint32_t applicationFlags = static_cast<uint32_t>(bundleInfo.applicationInfo.applicationFlags);
3074             if (!innerBundleInfo.HasInnerBundleUserInfo(originalUserId)) {
3075                 bundleInfo.applicationInfo.applicationFlags =
3076                     static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3077             } else if (innerUserInfos.size() > 1) {
3078                 bundleInfo.applicationInfo.applicationFlags =
3079                     static_cast<int32_t>(applicationFlags | flagOtherInstalled);
3080             }
3081         }
3082     }
3083 }
3084 
GetBaseSharedBundleInfos(const std::string & bundleName,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos,GetDependentBundleInfoFlag flag) const3085 ErrCode BundleDataMgr::GetBaseSharedBundleInfos(const std::string &bundleName,
3086     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag) const
3087 {
3088     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
3089     if ((flag == GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO) ||
3090         (flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO)) {
3091         // for app service hsp
3092         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3093         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
3094         for (const std::string &hspName : appServiceHspBundleName_) {
3095             APP_LOGD("get hspBundleName: %{public}s", hspName.c_str());
3096             auto infoItem = bundleInfos_.find(hspName);
3097             if (infoItem == bundleInfos_.end()) {
3098                 APP_LOGW("get hsp bundleInfo failed, hspName:%{public}s", hspName.c_str());
3099                 continue;
3100             }
3101             ConvertServiceHspToSharedBundleInfo(infoItem->second, baseSharedBundleInfos);
3102         }
3103     }
3104     if (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO ||
3105         flag == GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO) {
3106         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3107         auto infoItem = bundleInfos_.find(bundleName);
3108         if (infoItem == bundleInfos_.end()) {
3109             APP_LOGW("GetBaseSharedBundleInfos get bundleInfo failed, bundleName:%{public}s", bundleName.c_str());
3110             return (flag == GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO) ?
3111                 ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
3112         }
3113         const InnerBundleInfo &innerBundleInfo = infoItem->second;
3114         std::vector<Dependency> dependencies = innerBundleInfo.GetDependencies();
3115         for (const auto &item : dependencies) {
3116             BaseSharedBundleInfo baseSharedBundleInfo;
3117             if (GetBaseSharedBundleInfo(item, baseSharedBundleInfo)) {
3118                 baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
3119             }
3120         }
3121     }
3122     APP_LOGD("GetBaseSharedBundleInfos(%{public}s) successfully", bundleName.c_str());
3123     return ERR_OK;
3124 }
3125 
GetBundleType(const std::string & bundleName,BundleType & bundleType) const3126 bool BundleDataMgr::GetBundleType(const std::string &bundleName, BundleType &bundleType)const
3127 {
3128     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3129     auto item = bundleInfos_.find(bundleName);
3130     if (item == bundleInfos_.end()) {
3131         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
3132         return false;
3133     }
3134     bundleType = item->second.GetApplicationBundleType();
3135     APP_LOGI("bundle %{public}s bundleType is %{public}d", bundleName.c_str(), bundleType);
3136     return true;
3137 }
3138 
GetBaseSharedBundleInfo(const Dependency & dependency,BaseSharedBundleInfo & baseSharedBundleInfo) const3139 bool BundleDataMgr::GetBaseSharedBundleInfo(const Dependency &dependency,
3140     BaseSharedBundleInfo &baseSharedBundleInfo) const
3141 {
3142     auto infoItem = bundleInfos_.find(dependency.bundleName);
3143     if (infoItem == bundleInfos_.end()) {
3144         APP_LOGD("GetBaseSharedBundleInfo failed, can not find dependency bundle %{public}s",
3145             dependency.bundleName.c_str());
3146         return false;
3147     }
3148     const InnerBundleInfo &innerBundleInfo = infoItem->second;
3149     if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3150         innerBundleInfo.GetMaxVerBaseSharedBundleInfo(dependency.moduleName, baseSharedBundleInfo);
3151     } else {
3152         APP_LOGW("GetBaseSharedBundleInfo failed, can not find bundleType %{public}d",
3153             innerBundleInfo.GetApplicationBundleType());
3154         return false;
3155     }
3156     APP_LOGD("GetBaseSharedBundleInfo(%{public}s) successfully)", dependency.bundleName.c_str());
3157     return true;
3158 }
3159 
DeleteSharedBundleInfo(const std::string & bundleName)3160 bool BundleDataMgr::DeleteSharedBundleInfo(const std::string &bundleName)
3161 {
3162     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
3163     auto infoItem = bundleInfos_.find(bundleName);
3164     if (infoItem != bundleInfos_.end()) {
3165         APP_LOGD("del bundle name:%{public}s", bundleName.c_str());
3166         const InnerBundleInfo &innerBundleInfo = infoItem->second;
3167         bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
3168         if (!ret) {
3169             APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
3170         }
3171         bundleInfos_.erase(bundleName);
3172         return ret;
3173     }
3174     return false;
3175 }
3176 
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId) const3177 ErrCode BundleDataMgr::GetBundlePackInfo(
3178     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId) const
3179 {
3180     APP_LOGD("Service BundleDataMgr GetBundlePackInfo start");
3181     int32_t requestUserId;
3182     if (userId == Constants::UNSPECIFIED_USERID) {
3183         requestUserId = GetUserIdByCallingUid();
3184     } else {
3185         requestUserId = userId;
3186     }
3187 
3188     if (requestUserId == Constants::INVALID_USERID) {
3189         APP_LOGW("getBundlePackInfo userId is invalid");
3190         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3191     }
3192     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3193     InnerBundleInfo innerBundleInfo;
3194     if (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId)) {
3195         APP_LOGW("GetBundlePackInfo failed, bundleName:%{public}s", bundleName.c_str());
3196         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3197     }
3198     BundlePackInfo innerBundlePackInfo = innerBundleInfo.GetBundlePackInfo();
3199     if (static_cast<uint32_t>(flags) & GET_PACKAGES) {
3200         bundlePackInfo.packages = innerBundlePackInfo.packages;
3201         return ERR_OK;
3202     }
3203     if (static_cast<uint32_t>(flags) & GET_BUNDLE_SUMMARY) {
3204         bundlePackInfo.summary.app = innerBundlePackInfo.summary.app;
3205         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3206         return ERR_OK;
3207     }
3208     if (static_cast<uint32_t>(flags) & GET_MODULE_SUMMARY) {
3209         bundlePackInfo.summary.modules = innerBundlePackInfo.summary.modules;
3210         return ERR_OK;
3211     }
3212     bundlePackInfo = innerBundlePackInfo;
3213     return ERR_OK;
3214 }
3215 
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos) const3216 bool BundleDataMgr::GetBundleInfosByMetaData(
3217     const std::string &metaData, std::vector<BundleInfo> &bundleInfos) const
3218 {
3219     if (metaData.empty()) {
3220         APP_LOGW("bundle name is empty");
3221         return false;
3222     }
3223 
3224     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3225     if (bundleInfos_.empty()) {
3226         APP_LOGW("bundleInfos_ data is empty");
3227         return false;
3228     }
3229 
3230     bool find = false;
3231     int32_t requestUserId = GetUserId();
3232     for (const auto &item : bundleInfos_) {
3233         const InnerBundleInfo &info = item.second;
3234         if (info.IsDisabled()) {
3235             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3236             continue;
3237         }
3238         if (info.CheckSpecialMetaData(metaData)) {
3239             BundleInfo bundleInfo;
3240             int32_t responseUserId = info.GetResponseUserId(requestUserId);
3241             info.GetBundleInfo(
3242                 BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
3243             bundleInfos.emplace_back(bundleInfo);
3244             find = true;
3245         }
3246     }
3247     return find;
3248 }
3249 
GetBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3250 bool BundleDataMgr::GetBundleList(
3251     std::vector<std::string> &bundleNames, int32_t userId) const
3252 {
3253     int32_t requestUserId = GetUserId(userId);
3254     if (requestUserId == Constants::INVALID_USERID) {
3255         return false;
3256     }
3257 
3258     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3259     if (bundleInfos_.empty()) {
3260         APP_LOGW("bundleInfos_ data is empty");
3261         return false;
3262     }
3263 
3264     bool find = false;
3265     for (const auto &infoItem : bundleInfos_) {
3266         const InnerBundleInfo &innerBundleInfo = infoItem.second;
3267         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3268         if (CheckInnerBundleInfoWithFlags(
3269             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3270             continue;
3271         }
3272 
3273         bundleNames.emplace_back(infoItem.first);
3274         find = true;
3275     }
3276     APP_LOGD("user(%{public}d) get installed bundles list result(%{public}d)", userId, find);
3277     return find;
3278 }
3279 
GetDebugBundleList(std::vector<std::string> & bundleNames,int32_t userId) const3280 bool BundleDataMgr::GetDebugBundleList(std::vector<std::string> &bundleNames, int32_t userId) const
3281 {
3282     int32_t requestUserId = GetUserId(userId);
3283     if (requestUserId == Constants::INVALID_USERID) {
3284         APP_LOGE("UserId is invalid");
3285         return false;
3286     }
3287 
3288     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3289     if (bundleInfos_.empty()) {
3290         APP_LOGE("bundleInfos_ data is empty");
3291         return false;
3292     }
3293 
3294     for (const auto &infoItem : bundleInfos_) {
3295         const InnerBundleInfo &innerBundleInfo = infoItem.second;
3296         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3297         if (CheckInnerBundleInfoWithFlags(
3298             innerBundleInfo, BundleFlag::GET_BUNDLE_DEFAULT, responseUserId) != ERR_OK) {
3299             continue;
3300         }
3301 
3302         ApplicationInfo appInfo = innerBundleInfo.GetBaseApplicationInfo();
3303         if (appInfo.appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG) {
3304             bundleNames.emplace_back(infoItem.first);
3305         }
3306     }
3307 
3308     bool find = !bundleNames.empty();
3309     APP_LOGD("user(%{public}d) get installed debug bundles list result(%{public}d)", userId, find);
3310     return find;
3311 }
3312 
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3313 bool BundleDataMgr::GetBundleInfos(
3314     int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3315 {
3316     if (userId == Constants::ALL_USERID) {
3317         return GetAllBundleInfos(flags, bundleInfos);
3318     }
3319 
3320     int32_t requestUserId = GetUserId(userId);
3321     if (requestUserId == Constants::INVALID_USERID) {
3322         return false;
3323     }
3324 
3325     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3326     if (bundleInfos_.empty()) {
3327         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3328         return false;
3329     }
3330 
3331     bool find = false;
3332     for (const auto &item : bundleInfos_) {
3333         const InnerBundleInfo &innerBundleInfo = item.second;
3334         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3335             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3336                 innerBundleInfo.GetBundleName().c_str());
3337             continue;
3338         }
3339 
3340         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3341         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
3342             continue;
3343         }
3344 
3345         BundleInfo bundleInfo;
3346         if (!innerBundleInfo.GetBundleInfo(flags, bundleInfo, responseUserId)) {
3347             continue;
3348         }
3349 
3350         bundleInfos.emplace_back(bundleInfo);
3351         find = true;
3352         // add clone bundle info
3353         // flags convert
3354         GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3355     }
3356 
3357     LOG_D(BMS_TAG_QUERY, "get bundleInfos result(%{public}d) in user(%{public}d)", find, userId);
3358     return find;
3359 }
3360 
CheckInnerBundleInfoWithFlags(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3361 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlags(
3362     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3363 {
3364     if (userId == Constants::INVALID_USERID) {
3365         APP_LOGD("userId is invalid");
3366         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3367     }
3368     if (innerBundleInfo.IsDisabled()) {
3369         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3370         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3371     }
3372 
3373     if (appIndex == 0) {
3374         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
3375             && !innerBundleInfo.GetApplicationEnabled(userId)) {
3376             APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3377                 innerBundleInfo.GetBundleName().c_str(), userId);
3378             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3379         }
3380     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3381         int32_t requestUserId = GetUserId(userId);
3382         if (requestUserId == Constants::INVALID_USERID) {
3383             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3384         }
3385         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3386         bool isEnabled = false;
3387         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3388         if (ret != ERR_OK) {
3389             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3390         }
3391         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
3392             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3393                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3394             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3395         }
3396     } else {
3397         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3398     }
3399     return ERR_OK;
3400 }
3401 
CheckInnerBundleInfoWithFlagsV9(const InnerBundleInfo & innerBundleInfo,const int32_t flags,int32_t userId,int32_t appIndex) const3402 ErrCode BundleDataMgr::CheckInnerBundleInfoWithFlagsV9(
3403     const InnerBundleInfo &innerBundleInfo, const int32_t flags, int32_t userId, int32_t appIndex) const
3404 {
3405     if (userId == Constants::INVALID_USERID) {
3406         APP_LOGD("userId is invalid");
3407         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3408     }
3409     if (innerBundleInfo.IsDisabled()) {
3410         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
3411         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3412     }
3413 
3414     if (appIndex == 0) {
3415         if (!(static_cast<uint32_t>(flags) &
3416             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))) {
3417             bool isEnabled = false;
3418             ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(userId, isEnabled, appIndex);
3419             if (ret != ERR_OK) {
3420                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3421                     innerBundleInfo.GetBundleName().c_str(), userId);
3422                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3423             }
3424             if (!isEnabled) {
3425                 APP_LOGW("bundleName: %{public}s userId: %{public}d incorrect",
3426                     innerBundleInfo.GetBundleName().c_str(), userId);
3427                 return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3428             }
3429         }
3430     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
3431         int32_t requestUserId = GetUserId(userId);
3432         if (requestUserId == Constants::INVALID_USERID) {
3433             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3434         }
3435         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3436         bool isEnabled = false;
3437         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
3438         if (ret != ERR_OK) {
3439             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3440         }
3441         if (!(static_cast<uint32_t>(flags) &
3442             static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE))
3443             && !isEnabled) {
3444             APP_LOGW("bundleName: %{public}s userId: %{public}d, appIndex: %{public}d incorrect",
3445                 innerBundleInfo.GetBundleName().c_str(), requestUserId, appIndex);
3446             return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3447         }
3448     } else {
3449         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
3450     }
3451     return ERR_OK;
3452 }
3453 
CheckBundleAndAbilityDisabled(const InnerBundleInfo & info,int32_t flags,int32_t userId) const3454 ErrCode BundleDataMgr::CheckBundleAndAbilityDisabled(
3455     const InnerBundleInfo &info, int32_t flags, int32_t userId) const
3456 {
3457     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
3458     int32_t requestUserId = GetUserId(userId);
3459     if (requestUserId == Constants::INVALID_USERID) {
3460         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3461     }
3462 
3463     if (info.IsDisabled()) {
3464         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -f %{public}d",
3465             info.GetBundleName().c_str(), userId, flags);
3466         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
3467     }
3468 
3469     int32_t responseUserId = info.GetResponseUserId(requestUserId);
3470     bool isEnabled = false;
3471     auto ret = info.GetApplicationEnabledV9(responseUserId, isEnabled);
3472     if (ret != ERR_OK) {
3473         APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d -n %{public}s",
3474             ret, info.GetBundleName().c_str());
3475         return ret;
3476     }
3477     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
3478         && !isEnabled) {
3479         LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -f %{public}d",
3480             info.GetBundleName().c_str(), responseUserId, flags);
3481         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
3482     }
3483     return ERR_OK;
3484 }
3485 
GetAllBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3486 bool BundleDataMgr::GetAllBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3487 {
3488     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3489     if (bundleInfos_.empty()) {
3490         APP_LOGW("bundleInfos_ data is empty");
3491         return false;
3492     }
3493 
3494     bool find = false;
3495     for (const auto &item : bundleInfos_) {
3496         const InnerBundleInfo &info = item.second;
3497         if (info.IsDisabled()) {
3498             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3499             continue;
3500         }
3501         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3502             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3503             continue;
3504         }
3505         BundleInfo bundleInfo;
3506         info.GetBundleInfo(flags, bundleInfo, Constants::ALL_USERID);
3507         bundleInfos.emplace_back(bundleInfo);
3508         find = true;
3509         // add clone bundle info
3510         GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3511     }
3512 
3513     APP_LOGD("get all bundleInfos result(%{public}d)", find);
3514     return find;
3515 }
3516 
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId) const3517 ErrCode BundleDataMgr::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId) const
3518 {
3519     if (userId == Constants::ALL_USERID) {
3520         return GetAllBundleInfosV9(flags, bundleInfos);
3521     }
3522     int32_t requestUserId = GetUserId(userId);
3523     if (requestUserId == Constants::INVALID_USERID) {
3524         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3525     }
3526     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3527     if (bundleInfos_.empty()) {
3528         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty");
3529         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3530     }
3531     bool ofAnyUserFlag =
3532         (static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_OF_ANY_USER)) != 0;
3533     for (const auto &item : bundleInfos_) {
3534         const InnerBundleInfo &innerBundleInfo = item.second;
3535         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED) {
3536             LOG_D(BMS_TAG_QUERY, "app %{public}s is cross-app shared bundle, ignore",
3537                 innerBundleInfo.GetBundleName().c_str());
3538             continue;
3539         }
3540         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
3541         auto flag = GET_BASIC_APPLICATION_INFO;
3542         if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
3543             == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) {
3544             flag = GET_APPLICATION_INFO_WITH_DISABLE;
3545         }
3546         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
3547             auto &hp = innerBundleInfo.GetInnerBundleUserInfos();
3548             if (ofAnyUserFlag && hp.size() > 0) {
3549                 responseUserId = hp.begin()->second.bundleUserInfo.userId;
3550             } else {
3551                 continue;
3552             }
3553         }
3554         uint32_t launchFlag = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY);
3555         if (((static_cast<uint32_t>(flags) & launchFlag) == launchFlag) && (innerBundleInfo.IsHideDesktopIcon())) {
3556             LOG_D(BMS_TAG_QUERY, "bundleName %{public}s is hide desktopIcon",
3557                 innerBundleInfo.GetBundleName().c_str());
3558             continue;
3559         }
3560         BundleInfo bundleInfo;
3561         if (innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId) != ERR_OK) {
3562             continue;
3563         }
3564         ProcessBundleMenu(bundleInfo, flags, true);
3565         ProcessBundleRouterMap(bundleInfo, flags);
3566         PostProcessAnyUserFlags(flags, responseUserId, requestUserId, bundleInfo, innerBundleInfo);
3567         bundleInfos.emplace_back(bundleInfo);
3568         if (!ofAnyUserFlag && ((static_cast<uint32_t>(flags) &
3569             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3570             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3571             // add clone bundle info
3572             GetCloneBundleInfos(innerBundleInfo, flags, responseUserId, bundleInfo, bundleInfos);
3573         }
3574     }
3575     if (bundleInfos.empty()) {
3576         LOG_W(BMS_TAG_QUERY, "bundleInfos is empty");
3577     }
3578     return ERR_OK;
3579 }
3580 
GetAllBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos) const3581 ErrCode BundleDataMgr::GetAllBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos) const
3582 {
3583     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3584     if (bundleInfos_.empty()) {
3585         APP_LOGW("bundleInfos_ data is empty");
3586         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3587     }
3588 
3589     for (const auto &item : bundleInfos_) {
3590         const InnerBundleInfo &info = item.second;
3591         if (info.IsDisabled()) {
3592             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
3593             continue;
3594         }
3595         if (info.GetApplicationBundleType() == BundleType::SHARED) {
3596             APP_LOGD("app %{public}s is cross-app shared bundle, ignore", info.GetBundleName().c_str());
3597             continue;
3598         }
3599         if (((static_cast<uint32_t>(flags) &
3600             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) ==
3601             static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY)) &&
3602             (info.IsHideDesktopIcon())) {
3603             APP_LOGD("getAllBundleInfosV9 bundleName %{public}s is hide desktopIcon",
3604                 info.GetBundleName().c_str());
3605             continue;
3606         }
3607         BundleInfo bundleInfo;
3608         info.GetBundleInfoV9(flags, bundleInfo, Constants::ALL_USERID);
3609         auto ret = ProcessBundleMenu(bundleInfo, flags, true);
3610         if (ret == ERR_OK) {
3611             bundleInfos.emplace_back(bundleInfo);
3612             if (((static_cast<uint32_t>(flags) &
3613                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE)) !=
3614                 static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_EXCLUDE_CLONE))) {
3615                 // add clone bundle info
3616                 GetCloneBundleInfos(info, flags, Constants::ALL_USERID, bundleInfo, bundleInfos);
3617             }
3618         }
3619     }
3620     if (bundleInfos.empty()) {
3621         APP_LOGW("bundleInfos is empty");
3622     }
3623     return ERR_OK;
3624 }
3625 
GetBundleNameForUid(const int32_t uid,std::string & bundleName) const3626 bool BundleDataMgr::GetBundleNameForUid(const int32_t uid, std::string &bundleName) const
3627 {
3628     int32_t appIndex = 0;
3629     return GetBundleNameAndIndexForUid(uid, bundleName, appIndex) == ERR_OK;
3630 }
3631 
GetBundleNameAndIndexForUid(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3632 ErrCode BundleDataMgr::GetBundleNameAndIndexForUid(const int32_t uid, std::string &bundleName,
3633     int32_t &appIndex) const
3634 {
3635     InnerBundleInfo innerBundleInfo;
3636     if (GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex) != ERR_OK) {
3637         if (sandboxAppHelper_ == nullptr) {
3638             return ERR_BUNDLE_MANAGER_INVALID_UID;
3639         }
3640         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
3641             return ERR_BUNDLE_MANAGER_INVALID_UID;
3642         }
3643     }
3644 
3645     bundleName = innerBundleInfo.GetBundleName();
3646     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
3647         uid, bundleName.c_str(), appIndex);
3648     return ERR_OK;
3649 }
3650 
GetBundleNameAndIndex(const int32_t uid,std::string & bundleName,int32_t & appIndex) const3651 ErrCode BundleDataMgr::GetBundleNameAndIndex(const int32_t uid, std::string &bundleName,
3652     int32_t &appIndex) const
3653 {
3654     if (uid < Constants::BASE_APP_UID) {
3655         APP_LOGD("the uid(%{public}d) is not an application", uid);
3656         return ERR_BUNDLE_MANAGER_INVALID_UID;
3657     }
3658     int32_t userId = GetUserIdByUid(uid);
3659     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3660     if (bundleId < 0) {
3661         APP_LOGD("the uid(%{public}d) is not an application", uid);
3662         return ERR_BUNDLE_MANAGER_INVALID_UID;
3663     }
3664 
3665     std::shared_lock<std::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3666     auto bundleIdIter = bundleIdMap_.find(bundleId);
3667     if (bundleIdIter == bundleIdMap_.end()) {
3668         APP_LOGW_NOFUNC("bundleId %{public}d is not existed", bundleId);
3669         return ERR_BUNDLE_MANAGER_INVALID_UID;
3670     }
3671     std::string keyName = bundleIdIter->second;
3672     if (keyName.empty()) {
3673         return ERR_BUNDLE_MANAGER_INVALID_UID;
3674     }
3675     // bundleName, sandbox_app: \d+_w+, clone_app: \d+clone_w+, others
3676     if (isdigit(keyName[0])) {
3677         size_t pos = keyName.find_first_not_of("0123456789");
3678         if (pos == std::string::npos) {
3679             return ERR_BUNDLE_MANAGER_INVALID_UID;
3680         }
3681         std::string index = keyName.substr(0, pos);
3682         if (!OHOS::StrToInt(index, appIndex)) {
3683             return ERR_BUNDLE_MANAGER_INVALID_UID;
3684         }
3685 
3686         auto clonePos = keyName.find(CLONE_BUNDLE_PREFIX);
3687         if (clonePos != std::string::npos && clonePos == pos) {
3688             bundleName = keyName.substr(clonePos + strlen(CLONE_BUNDLE_PREFIX));
3689             return ERR_OK;
3690         }
3691 
3692         auto sandboxPos = keyName.find(Constants::FILE_UNDERLINE);
3693         if (sandboxPos != std::string::npos && sandboxPos == pos) {
3694             bundleName = keyName.substr(sandboxPos + strlen(Constants::FILE_UNDERLINE));
3695             return ERR_OK;
3696         }
3697     }
3698 
3699     bundleName = keyName;
3700     appIndex = 0;
3701     return ERR_OK;
3702 }
3703 
GetInnerBundleInfoAndIndexByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo,int32_t & appIndex) const3704 ErrCode BundleDataMgr::GetInnerBundleInfoAndIndexByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo,
3705     int32_t &appIndex) const
3706 {
3707     if (uid < Constants::BASE_APP_UID) {
3708         APP_LOGD("the uid(%{public}d) is not an application", uid);
3709         return ERR_BUNDLE_MANAGER_INVALID_UID;
3710     }
3711     int32_t userId = GetUserIdByUid(uid);
3712     int32_t bundleId = uid - userId * Constants::BASE_USER_RANGE;
3713 
3714     std::string keyName;
3715     {
3716         std::shared_lock<std::shared_mutex> bundleIdLock(bundleIdMapMutex_);
3717         auto bundleIdIter = bundleIdMap_.find(bundleId);
3718         if (bundleIdIter == bundleIdMap_.end()) {
3719             APP_LOGW_NOFUNC("uid %{public}d is not existed", uid);
3720             return ERR_BUNDLE_MANAGER_INVALID_UID;
3721         }
3722         keyName = bundleIdIter->second;
3723     }
3724     std::string bundleName = keyName;
3725     GetBundleNameAndIndexByName(keyName, bundleName, appIndex);
3726 
3727     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3728     auto bundleInfoIter = bundleInfos_.find(bundleName);
3729     if (bundleInfoIter == bundleInfos_.end()) {
3730         APP_LOGE("bundleName %{public}s is not existed in bundleInfos_", bundleName.c_str());
3731         return ERR_BUNDLE_MANAGER_INVALID_UID;
3732     }
3733     int32_t oriUid = bundleInfoIter->second.GetUid(userId, appIndex);
3734     if (oriUid == uid) {
3735         innerBundleInfo = bundleInfoIter->second;
3736         return ERR_OK;
3737     }
3738 
3739     APP_LOGW("bn %{public}s uid %{public}d oriUid %{public}d ", bundleName.c_str(), uid, oriUid);
3740     return ERR_BUNDLE_MANAGER_INVALID_UID;
3741 }
3742 
GetInnerBundleInfoByUid(const int32_t uid,InnerBundleInfo & innerBundleInfo) const3743 ErrCode BundleDataMgr::GetInnerBundleInfoByUid(const int32_t uid, InnerBundleInfo &innerBundleInfo) const
3744 {
3745     int32_t appIndex = 0;
3746     return GetInnerBundleInfoAndIndexByUid(uid, innerBundleInfo, appIndex);
3747 }
3748 
GetRecoverablePreInstallBundleInfos()3749 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetRecoverablePreInstallBundleInfos()
3750 {
3751     std::vector<PreInstallBundleInfo> recoverablePreInstallBundleInfos;
3752     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3753     if (userId == Constants::INVALID_USERID) {
3754         APP_LOGW("userId %{public}d is invalid", userId);
3755         return recoverablePreInstallBundleInfos;
3756     }
3757     std::vector<PreInstallBundleInfo> preInstallBundleInfos = GetAllPreInstallBundleInfos();
3758     for (auto preInstallBundleInfo: preInstallBundleInfos) {
3759         if (!preInstallBundleInfo.IsRemovable()) {
3760             continue;
3761         }
3762         if (preInstallBundleInfo.HasForceUninstalledUser(userId)) {
3763             APP_LOGW("-n %{public}s is force unisntalled in -u %{public}d",
3764                 preInstallBundleInfo.GetBundleName().c_str(), userId);
3765             continue;
3766         }
3767         if (BundleUserMgrHostImpl::SkipThirdPreloadAppInstallation(userId, preInstallBundleInfo)) {
3768             continue;
3769         }
3770         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3771         auto infoItem = bundleInfos_.find(preInstallBundleInfo.GetBundleName());
3772         if (infoItem == bundleInfos_.end()) {
3773             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3774             continue;
3775         }
3776         if (!infoItem->second.HasInnerBundleUserInfo(Constants::DEFAULT_USERID) &&
3777             !infoItem->second.HasInnerBundleUserInfo(userId)) {
3778             recoverablePreInstallBundleInfos.emplace_back(preInstallBundleInfo);
3779         }
3780     }
3781     return recoverablePreInstallBundleInfos;
3782 }
3783 
IsBundleExist(const std::string & bundleName) const3784 bool BundleDataMgr::IsBundleExist(const std::string &bundleName) const
3785 {
3786     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3787     return bundleInfos_.find(bundleName) != bundleInfos_.end();
3788 }
3789 
HasUserInstallInBundle(const std::string & bundleName,const int32_t userId) const3790 bool BundleDataMgr::HasUserInstallInBundle(
3791     const std::string &bundleName, const int32_t userId) const
3792 {
3793     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3794     auto infoItem = bundleInfos_.find(bundleName);
3795     if (infoItem == bundleInfos_.end()) {
3796         return false;
3797     }
3798 
3799     return infoItem->second.HasInnerBundleUserInfo(userId);
3800 }
3801 
3802 #ifdef ABILITY_RUNTIME_ENABLE
GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,const std::string & bundleName,const std::vector<int32_t> & cloneAppIndexes) const3803 std::vector<int32_t> BundleDataMgr::GetNoRunningBundleCloneIndexes(const sptr<IAppMgr> appMgrProxy,
3804     const std::string &bundleName, const std::vector<int32_t> &cloneAppIndexes) const
3805 {
3806     std::vector<int32_t> noRunningCloneAppIndexes;
3807     if (appMgrProxy == nullptr) {
3808         APP_LOGW("fail to find the app mgr service to check app is running");
3809         return noRunningCloneAppIndexes;
3810     }
3811 
3812     for (const auto &appIndex : cloneAppIndexes) {
3813         bool running = SystemAbilityHelper::IsAppRunning(appMgrProxy, bundleName, appIndex);
3814         if (running) {
3815             APP_LOGW("No del cache for %{public}s[%{public}d]: is running", bundleName.c_str(), appIndex);
3816             continue;
3817         }
3818         noRunningCloneAppIndexes.emplace_back(appIndex);
3819     }
3820     return noRunningCloneAppIndexes;
3821 }
3822 #endif
3823 
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) const3824 void BundleDataMgr::GetBundleCacheInfo(
3825     std::function<std::vector<int32_t>(std::string&, std::vector<int32_t>&)> idxFilter,
3826     const InnerBundleInfo &info,
3827     std::vector<std::tuple<std::string, std::vector<std::string>, std::vector<int32_t>>> &validBundles,
3828     const int32_t userId, bool isClean) const
3829 {
3830     std::string bundleName = info.GetBundleName();
3831     if (isClean && !info.GetBaseApplicationInfo().userDataClearable) {
3832         APP_LOGW("Not clearable:%{public}s, userid:%{public}d", bundleName.c_str(), userId);
3833         return;
3834     }
3835     std::vector<std::string> moduleNameList;
3836     info.GetModuleNames(moduleNameList);
3837     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, userId);
3838     cloneAppIndexes.emplace_back(0);
3839     std::vector<int32_t> allAppIndexes = cloneAppIndexes;
3840     if (isClean) {
3841         allAppIndexes = idxFilter(bundleName, cloneAppIndexes);
3842     }
3843     validBundles.emplace_back(std::make_tuple(bundleName, moduleNameList, allAppIndexes));
3844     // add atomic service
3845     if (info.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE) {
3846         std::string atomicServiceName;
3847         AccountSA::OhosAccountInfo accountInfo;
3848         auto ret = GetDirForAtomicServiceByUserId(bundleName, userId, accountInfo, atomicServiceName);
3849         if (ret == ERR_OK && !atomicServiceName.empty()) {
3850             APP_LOGD("atomicServiceName: %{public}s", atomicServiceName.c_str());
3851             validBundles.emplace_back(std::make_tuple(atomicServiceName, moduleNameList, allAppIndexes));
3852         }
3853     }
3854 }
3855 
GetBundleCacheInfos(const int32_t userId,std::vector<std::tuple<std::string,std::vector<std::string>,std::vector<int32_t>>> & validBundles,bool isClean) const3856 void BundleDataMgr::GetBundleCacheInfos(const int32_t userId, std::vector<std::tuple<std::string,
3857     std::vector<std::string>, std::vector<int32_t>>> &validBundles, bool isClean) const
3858 {
3859 #ifdef ABILITY_RUNTIME_ENABLE
3860     sptr<IAppMgr> appMgrProxy = iface_cast<IAppMgr>(SystemAbilityHelper::GetSystemAbility(APP_MGR_SERVICE_ID));
3861     if (appMgrProxy == nullptr) {
3862         APP_LOGE("CleanBundleCache fail to find the app mgr service to check app is running");
3863         return;
3864     }
3865     auto idxFiltor = [&appMgrProxy, this](std::string &bundleName, std::vector<int32_t> &allidx) {
3866         return this->GetNoRunningBundleCloneIndexes(appMgrProxy, bundleName, allidx);
3867     };
3868 #else
3869     auto idxFiltor = [](std::string &bundleName, std::vector<int32_t> &allidx) {
3870         return allidx;
3871     };
3872 #endif
3873     std::map<std::string, InnerBundleInfo> infos = GetAllInnerBundleInfos();
3874     for (const auto &item : infos) {
3875         GetBundleCacheInfo(idxFiltor, item.second, validBundles, userId, isClean);
3876     }
3877     return;
3878 }
3879 
GetBundleStats(const std::string & bundleName,const int32_t userId,std::vector<int64_t> & bundleStats,const int32_t appIndex,const uint32_t statFlag) const3880 bool BundleDataMgr::GetBundleStats(const std::string &bundleName,
3881     const int32_t userId, std::vector<int64_t> &bundleStats, const int32_t appIndex, const uint32_t statFlag) const
3882 {
3883     int32_t responseUserId = -1;
3884     int32_t uid = -1;
3885     std::vector<std::string> moduleNameList;
3886     {
3887         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3888         const auto infoItem = bundleInfos_.find(bundleName);
3889         if (infoItem == bundleInfos_.end()) {
3890             return false;
3891         }
3892         responseUserId = infoItem->second.GetResponseUserId(userId);
3893         uid = infoItem->second.GetUid(responseUserId, appIndex);
3894         infoItem->second.GetModuleNames(moduleNameList);
3895     }
3896     ErrCode ret = InstalldClient::GetInstance()->GetBundleStats(
3897         bundleName, responseUserId, bundleStats, uid, appIndex, statFlag, moduleNameList);
3898     if (ret != ERR_OK) {
3899         APP_LOGW("%{public}s getStats failed", bundleName.c_str());
3900         return false;
3901     }
3902     {
3903         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3904         const auto infoItem = bundleInfos_.find(bundleName);
3905         if (infoItem == bundleInfos_.end()) {
3906             return false;
3907         }
3908         if (appIndex == 0 && infoItem->second.IsPreInstallApp() && !bundleStats.empty()) {
3909             for (const auto &innerModuleInfo : infoItem->second.GetInnerModuleInfos()) {
3910                 if (innerModuleInfo.second.hapPath.find(Constants::BUNDLE_CODE_DIR) == 0) {
3911                     continue;
3912                 }
3913                 bundleStats[0] += BundleUtil::GetFileSize(innerModuleInfo.second.hapPath);
3914             }
3915         }
3916     }
3917 
3918     return true;
3919 }
3920 
GetBundleModuleNames(const std::string & bundleName,std::vector<std::string> & moduleNameList) const3921 void BundleDataMgr::GetBundleModuleNames(const std::string &bundleName,
3922     std::vector<std::string> &moduleNameList) const
3923 {
3924     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3925     const auto infoItem = bundleInfos_.find(bundleName);
3926     if (infoItem == bundleInfos_.end()) {
3927         APP_LOGW("No modules of: %{public}s", bundleName.c_str());
3928         return;
3929     }
3930     infoItem->second.GetModuleNames(moduleNameList);
3931 }
3932 
GetAllBundleStats(const int32_t userId,std::vector<int64_t> & bundleStats) const3933 bool BundleDataMgr::GetAllBundleStats(const int32_t userId, std::vector<int64_t> &bundleStats) const
3934 {
3935     std::vector<int32_t> uids;
3936     int32_t responseUserId = userId;
3937     int32_t requestUserId = GetUserId(userId);
3938     if (requestUserId == Constants::INVALID_USERID) {
3939         APP_LOGE("invalid userid :%{public}d", userId);
3940         return false;
3941     }
3942     {
3943         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
3944         for (const auto &item : bundleInfos_) {
3945             const InnerBundleInfo &info = item.second;
3946             std::string bundleName = info.GetBundleName();
3947             responseUserId = info.GetResponseUserId(requestUserId);
3948             if (responseUserId == Constants::INVALID_USERID) {
3949                 APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
3950                 continue;
3951             }
3952             BundleType type = info.GetApplicationBundleType();
3953             if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
3954                 APP_LOGD("BundleType is invalid: %{public}d, bundname: %{public}s", type, bundleName.c_str());
3955                 continue;
3956             }
3957             std::vector<int32_t> allAppIndexes = {0};
3958             if (type == BundleType::APP) {
3959                 std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
3960                 allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
3961             }
3962             for (int32_t appIndex: allAppIndexes) {
3963                 int32_t uid = info.GetUid(responseUserId, appIndex);
3964                 uids.emplace_back(uid);
3965             }
3966         }
3967     }
3968     if (InstalldClient::GetInstance()->GetAllBundleStats(responseUserId, bundleStats, uids) != ERR_OK) {
3969         APP_LOGW("GetAllBundleStats failed, userId: %{public}d", responseUserId);
3970         return false;
3971     }
3972     if (bundleStats.empty()) {
3973         APP_LOGE("bundle stats is empty");
3974         return true;
3975     }
3976     return true;
3977 }
3978 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetBundleSpaceSize(const std::string & bundleName) const3979 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName) const
3980 {
3981     return GetBundleSpaceSize(bundleName, AccountHelper::GetCurrentActiveUserId());
3982 }
3983 
GetBundleSpaceSize(const std::string & bundleName,int32_t userId) const3984 int64_t BundleDataMgr::GetBundleSpaceSize(const std::string &bundleName, int32_t userId) const
3985 {
3986     int64_t spaceSize = 0;
3987     if (userId != Constants::ALL_USERID) {
3988         std::vector<int64_t> bundleStats;
3989         if (!GetBundleStats(bundleName, userId, bundleStats) || bundleStats.empty()) {
3990             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
3991             return spaceSize;
3992         }
3993 
3994         spaceSize = std::accumulate(bundleStats.begin(), bundleStats.end(), spaceSize);
3995         return spaceSize;
3996     }
3997 
3998     for (const auto &iterUserId : GetAllUser()) {
3999         std::vector<int64_t> bundleStats;
4000         if (!GetBundleStats(bundleName, iterUserId, bundleStats) || bundleStats.empty()) {
4001             APP_LOGW("GetBundleStats: bundleName: %{public}s failed", bundleName.c_str());
4002             continue;
4003         }
4004 
4005         auto startIter = bundleStats.begin();
4006         auto endIter = bundleStats.end();
4007         if (spaceSize == 0) {
4008             spaceSize = std::accumulate(startIter, endIter, spaceSize);
4009         } else {
4010             spaceSize = std::accumulate(++startIter, endIter, spaceSize);
4011         }
4012     }
4013 
4014     return spaceSize;
4015 }
4016 
GetAllFreeInstallBundleSpaceSize() const4017 int64_t BundleDataMgr::GetAllFreeInstallBundleSpaceSize() const
4018 {
4019     int64_t allSize = 0;
4020     std::map<std::string, std::vector<std::string>> freeInstallModules;
4021     if (!GetFreeInstallModules(freeInstallModules)) {
4022         APP_LOGW("no removable bundles");
4023         return allSize;
4024     }
4025 
4026     for (const auto &iter : freeInstallModules) {
4027         APP_LOGD("%{public}s is freeInstall bundle", iter.first.c_str());
4028         allSize += GetBundleSpaceSize(iter.first, Constants::ALL_USERID);
4029     }
4030 
4031     APP_LOGI("All freeInstall app size:%{public}" PRId64, allSize);
4032     return allSize;
4033 }
4034 
GetFreeInstallModules(std::map<std::string,std::vector<std::string>> & freeInstallModules) const4035 bool BundleDataMgr::GetFreeInstallModules(
4036     std::map<std::string, std::vector<std::string>> &freeInstallModules) const
4037 {
4038     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4039     if (bundleInfos_.empty()) {
4040         APP_LOGW("bundleInfos_ is data is empty");
4041         return false;
4042     }
4043 
4044     for (const auto &iter : bundleInfos_) {
4045         std::vector<std::string> modules;
4046         if (!iter.second.GetFreeInstallModules(modules)) {
4047             continue;
4048         }
4049 
4050         freeInstallModules.emplace(iter.first, modules);
4051     }
4052 
4053     return !freeInstallModules.empty();
4054 }
4055 #endif
4056 
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames) const4057 bool BundleDataMgr::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames) const
4058 {
4059     InnerBundleInfo innerBundleInfo;
4060     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4061         APP_LOGD("get innerBundleInfo by uid :%{public}d failed", uid);
4062         return false;
4063     }
4064 
4065     bundleNames.emplace_back(innerBundleInfo.GetBundleName());
4066     return true;
4067 }
4068 
GetNameForUid(const int uid,std::string & name) const4069 ErrCode BundleDataMgr::GetNameForUid(const int uid, std::string &name) const
4070 {
4071     int32_t appIndex = 0;
4072     ErrCode ret = GetBundleNameAndIndex(uid, name, appIndex);
4073     if (ret != ERR_OK) {
4074         APP_LOGE("the uid(%{public}d) is not an application", uid);
4075         return ret;
4076     }
4077     APP_LOGD("GetBundleNameForUid, uid %{public}d, bundleName %{public}s, appIndex %{public}d",
4078         uid, name.c_str(), appIndex);
4079     return ERR_OK;
4080 }
4081 
GetInnerBundleInfoWithSandboxByUid(const int uid,InnerBundleInfo & innerBundleInfo) const4082 ErrCode BundleDataMgr::GetInnerBundleInfoWithSandboxByUid(const int uid, InnerBundleInfo &innerBundleInfo) const
4083 {
4084     ErrCode ret = GetInnerBundleInfoByUid(uid, innerBundleInfo);
4085     if (ret != ERR_OK) {
4086         APP_LOGD("get innerBundleInfo from bundleInfo_ by uid failed");
4087         if (sandboxAppHelper_ == nullptr) {
4088             APP_LOGW("sandboxAppHelper_ is nullptr");
4089             return ERR_BUNDLE_MANAGER_INVALID_UID;
4090         }
4091         if (sandboxAppHelper_->GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4092             APP_LOGE("Call GetInnerBundleInfoByUid failed");
4093             return ERR_BUNDLE_MANAGER_INVALID_UID;
4094         }
4095     }
4096     return ERR_OK;
4097 }
4098 
GetBundleGids(const std::string & bundleName,std::vector<int> & gids) const4099 bool BundleDataMgr::GetBundleGids(const std::string &bundleName, std::vector<int> &gids) const
4100 {
4101     int32_t requestUserId = GetUserId();
4102     InnerBundleUserInfo innerBundleUserInfo;
4103     if (!GetInnerBundleUserInfoByUserId(bundleName, requestUserId, innerBundleUserInfo)) {
4104         APP_LOGW("the user(%{public}d) is not exists in bundleName(%{public}s) ",
4105             requestUserId, bundleName.c_str());
4106         return false;
4107     }
4108 
4109     gids = innerBundleUserInfo.gids;
4110     return true;
4111 }
4112 
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids) const4113 bool BundleDataMgr::GetBundleGidsByUid(
4114     const std::string &bundleName, const int &uid, std::vector<int> &gids) const
4115 {
4116     return true;
4117 }
4118 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos) const4119 bool BundleDataMgr::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos) const
4120 {
4121     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4122     if (bundleInfos_.empty()) {
4123         APP_LOGW("bundleInfos_ data is empty");
4124         return false;
4125     }
4126 
4127     int32_t requestUserId = GetUserId();
4128     for (const auto &info : bundleInfos_) {
4129         if (info.second.IsDisabled()) {
4130             APP_LOGD("app %{public}s is disabled", info.second.GetBundleName().c_str());
4131             continue;
4132         }
4133         if (info.second.GetIsKeepAlive()) {
4134             BundleInfo bundleInfo;
4135             int32_t responseUserId = info.second.GetResponseUserId(requestUserId);
4136             info.second.GetBundleInfo(BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, responseUserId);
4137             if (bundleInfo.name == "") {
4138                 continue;
4139             }
4140             bundleInfos.emplace_back(bundleInfo);
4141         }
4142     }
4143     return !(bundleInfos.empty());
4144 }
4145 
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label) const4146 ErrCode BundleDataMgr::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
4147     const std::string &abilityName, std::string &label) const
4148 {
4149 #ifdef GLOBAL_RESMGR_ENABLE
4150     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4151     int32_t requestUserId = GetUserId();
4152     if (requestUserId == Constants::INVALID_USERID) {
4153         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4154     }
4155     InnerBundleInfo innerBundleInfo;
4156     ErrCode ret =
4157         GetInnerBundleInfoWithFlagsV9(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
4158     if (ret != ERR_OK) {
4159         return ret;
4160     }
4161     AbilityInfo abilityInfo;
4162     ret = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
4163     if (ret != ERR_OK) {
4164         APP_LOGD("Find ability failed. bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s",
4165             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
4166         return ret;
4167     }
4168     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4169     bool isEnable = false;
4170     ret = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
4171     if (ret != ERR_OK) {
4172         return ret;
4173     }
4174     if (!isEnable) {
4175         APP_LOGW("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
4176         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
4177     }
4178     if (abilityInfo.labelId == 0) {
4179         label = abilityInfo.label;
4180         return ERR_OK;
4181     }
4182     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
4183         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
4184     if (resourceManager == nullptr) {
4185         APP_LOGW("InitResourceManager failed");
4186         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4187     }
4188     auto state = resourceManager->GetStringById(static_cast<uint32_t>(abilityInfo.labelId), label);
4189     if (state != OHOS::Global::Resource::RState::SUCCESS) {
4190         APP_LOGW("ResourceManager GetStringById failed");
4191         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4192     }
4193     return ERR_OK;
4194 #else
4195     APP_LOGW("GLOBAL_RES_MGR_ENABLE is false");
4196     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
4197 #endif
4198 }
4199 
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo,int32_t userId) const4200 bool BundleDataMgr::GetHapModuleInfo(
4201     const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo, int32_t userId) const
4202 {
4203     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4204     int32_t requestUserId = GetUserId(userId);
4205     if (requestUserId == Constants::INVALID_USERID) {
4206         return false;
4207     }
4208 
4209     if (bundleInfos_.empty()) {
4210         APP_LOGW("bundleInfos_ data is empty");
4211         return false;
4212     }
4213 
4214     APP_LOGD("GetHapModuleInfo bundleName: %{public}s", abilityInfo.bundleName.c_str());
4215     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4216     if (infoItem == bundleInfos_.end()) {
4217         return false;
4218     }
4219 
4220     const InnerBundleInfo &innerBundleInfo = infoItem->second;
4221     if (innerBundleInfo.IsDisabled()) {
4222         APP_LOGW("app %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4223         return false;
4224     }
4225 
4226     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4227     auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
4228     if (!module) {
4229         APP_LOGW("can not find module %{public}s, bundleName:%{public}s", abilityInfo.package.c_str(),
4230             abilityInfo.bundleName.c_str());
4231         return false;
4232     }
4233     hapModuleInfo = *module;
4234     return true;
4235 }
4236 
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId) const4237 ErrCode BundleDataMgr::GetLaunchWantForBundle(
4238     const std::string &bundleName, Want &want, int32_t userId) const
4239 {
4240     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4241     InnerBundleInfo innerBundleInfo;
4242     ErrCode ret = GetInnerBundleInfoWithFlagsV9(
4243         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId);
4244     if (ret != ERR_OK) {
4245         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s", bundleName.c_str());
4246         return ret;
4247     }
4248 
4249     std::string mainAbility = innerBundleInfo.GetMainAbility();
4250     if (mainAbility.empty()) {
4251         APP_LOGW("no main ability in the bundle %{public}s", bundleName.c_str());
4252         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4253     }
4254 
4255     want.SetElementName("", bundleName, mainAbility);
4256     want.SetAction(Constants::ACTION_HOME);
4257     want.AddEntity(Constants::ENTITY_HOME);
4258     return ERR_OK;
4259 }
4260 
CheckIsSystemAppByUid(const int uid) const4261 bool BundleDataMgr::CheckIsSystemAppByUid(const int uid) const
4262 {
4263     // If the value of uid is 0 (ROOT_UID) or 1000 (BMS_UID),
4264     // the uid should be the system uid.
4265     if (uid == Constants::ROOT_UID || uid == ServiceConstants::BMS_UID) {
4266         return true;
4267     }
4268 
4269     InnerBundleInfo innerBundleInfo;
4270     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
4271         return false;
4272     }
4273 
4274     return innerBundleInfo.IsSystemApp();
4275 }
4276 
InitStateTransferMap()4277 void BundleDataMgr::InitStateTransferMap()
4278 {
4279     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::INSTALL_START);
4280     transferStates_.emplace(InstallState::INSTALL_FAIL, InstallState::INSTALL_START);
4281     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_SUCCESS);
4282     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::INSTALL_START);
4283     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UPDATING_SUCCESS);
4284     transferStates_.emplace(InstallState::UNINSTALL_FAIL, InstallState::UNINSTALL_START);
4285     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::UNINSTALL_START);
4286     transferStates_.emplace(InstallState::UNINSTALL_SUCCESS, InstallState::UNINSTALL_START);
4287     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_SUCCESS);
4288     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::UPDATING_START);
4289     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_START);
4290     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::INSTALL_START);
4291     transferStates_.emplace(InstallState::UPDATING_START, InstallState::INSTALL_START);
4292     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_START);
4293     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UPDATING_SUCCESS);
4294     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::UNINSTALL_START);
4295     transferStates_.emplace(InstallState::UPDATING_START, InstallState::UPDATING_SUCCESS);
4296     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_START);
4297     transferStates_.emplace(InstallState::ROLL_BACK, InstallState::UPDATING_SUCCESS);
4298     transferStates_.emplace(InstallState::UPDATING_FAIL, InstallState::UPDATING_SUCCESS);
4299     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::ROLL_BACK);
4300     transferStates_.emplace(InstallState::UNINSTALL_START, InstallState::USER_CHANGE);
4301     transferStates_.emplace(InstallState::UPDATING_START, InstallState::USER_CHANGE);
4302     transferStates_.emplace(InstallState::INSTALL_SUCCESS, InstallState::USER_CHANGE);
4303     transferStates_.emplace(InstallState::UPDATING_SUCCESS, InstallState::USER_CHANGE);
4304     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::INSTALL_SUCCESS);
4305     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_SUCCESS);
4306     transferStates_.emplace(InstallState::USER_CHANGE, InstallState::UPDATING_START);
4307 }
4308 
IsDeleteDataState(const InstallState state) const4309 bool BundleDataMgr::IsDeleteDataState(const InstallState state) const
4310 {
4311     return (state == InstallState::INSTALL_FAIL || state == InstallState::UNINSTALL_FAIL ||
4312             state == InstallState::UNINSTALL_SUCCESS || state == InstallState::UPDATING_FAIL);
4313 }
4314 
IsDisableState(const InstallState state) const4315 bool BundleDataMgr::IsDisableState(const InstallState state) const
4316 {
4317     if (state == InstallState::UPDATING_START || state == InstallState::UNINSTALL_START) {
4318         return true;
4319     }
4320     return false;
4321 }
4322 
DeleteBundleInfo(const std::string & bundleName,const InstallState state,const bool isKeepData)4323 void BundleDataMgr::DeleteBundleInfo(const std::string &bundleName, const InstallState state, const bool isKeepData)
4324 {
4325     if (InstallState::INSTALL_FAIL == state) {
4326         APP_LOGW("del fail, bundle:%{public}s has no installed info", bundleName.c_str());
4327         return;
4328     }
4329 
4330     auto infoItem = bundleInfos_.find(bundleName);
4331     if (infoItem == bundleInfos_.end()) {
4332         APP_LOGW("create infoItem fail, bundleName:%{public}s", bundleName.c_str());
4333         return;
4334     }
4335 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
4336     // remove external overlay bundle info and connection
4337     RemoveOverlayInfoAndConnection(infoItem->second, bundleName);
4338 #endif
4339     APP_LOGI("del bundle name:%{public}s", bundleName.c_str());
4340     const InnerBundleInfo &innerBundleInfo = infoItem->second;
4341     if (!isKeepData) {
4342         RecycleUidAndGid(innerBundleInfo);
4343     }
4344     bool ret = dataStorage_->DeleteStorageBundleInfo(innerBundleInfo);
4345     if (!ret) {
4346         APP_LOGW("delete storage error name:%{public}s", bundleName.c_str());
4347     }
4348     bundleInfos_.erase(bundleName);
4349     std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
4350     if (appServiceHspBundleName_.find(bundleName) != appServiceHspBundleName_.end()) {
4351         appServiceHspBundleName_.erase(bundleName);
4352     }
4353     DeleteDesktopShortcutInfo(bundleName);
4354 }
4355 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,int32_t userId,int32_t appIndex) const4356 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4357     const int32_t flags, int32_t userId, int32_t appIndex) const
4358 {
4359     if (bundleName.empty()) {
4360         return false;
4361     }
4362     int32_t requestUserId = GetUserId(userId);
4363     if (requestUserId == Constants::INVALID_USERID) {
4364         return false;
4365     }
4366 
4367     if (bundleInfos_.empty()) {
4368         APP_LOGW("bundleInfos_ data is empty");
4369         return false;
4370     }
4371     APP_LOGD("GetInnerBundleInfoWithFlags: %{public}s", bundleName.c_str());
4372     auto item = bundleInfos_.find(bundleName);
4373     if (item == bundleInfos_.end()) {
4374         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4375             bundleName.c_str(), userId, appIndex, flags);
4376         return false;
4377     }
4378     const InnerBundleInfo &innerBundleInfo = item->second;
4379     if (innerBundleInfo.IsDisabled()) {
4380         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4381             bundleName.c_str(), userId, appIndex, flags);
4382         return false;
4383     }
4384 
4385     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4386     if (appIndex == 0) {
4387         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE)
4388             && !innerBundleInfo.GetApplicationEnabled(responseUserId)) {
4389             LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4390                 bundleName.c_str(), responseUserId, appIndex, flags);
4391             return false;
4392         }
4393     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
4394         bool isEnabled = false;
4395         ErrCode ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4396         if (ret != ERR_OK) {
4397             APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d", ret);
4398             return false;
4399         }
4400         if (!(static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_DISABLE) && !isEnabled) {
4401             LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4402                 bundleName.c_str(), responseUserId, appIndex, flags);
4403             return false;
4404         }
4405     } else {
4406         return false;
4407     }
4408     return true;
4409 }
4410 
GetInnerBundleInfoWithFlags(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4411 bool BundleDataMgr::GetInnerBundleInfoWithFlags(const std::string &bundleName,
4412     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4413 {
4414     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, userId, appIndex);
4415     if (!res) {
4416         return false;
4417     }
4418     auto item = bundleInfos_.find(bundleName);
4419     if (item == bundleInfos_.end()) {
4420         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4421         return false;
4422     }
4423     info = item->second;
4424     return true;
4425 }
4426 
GetInnerBundleInfoWithBundleFlagsAndLock(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId) const4427 bool BundleDataMgr::GetInnerBundleInfoWithBundleFlagsAndLock(const std::string &bundleName,
4428     const int32_t flags, InnerBundleInfo &info, int32_t userId) const
4429 {
4430     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4431     bool res = GetInnerBundleInfoWithFlags(bundleName, flags, info, userId);
4432     if (!res) {
4433         APP_LOGD("GetInnerBundleInfoWithBundleFlagsAndLock: bundleName %{public}s not find", bundleName.c_str());
4434         return res;
4435     }
4436     return true;
4437 }
4438 
GetInnerBundleInfoWithFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4439 ErrCode BundleDataMgr::GetInnerBundleInfoWithFlagsV9(const std::string &bundleName,
4440     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4441 {
4442     int32_t requestUserId = GetUserId(userId);
4443     if (requestUserId == Constants::INVALID_USERID) {
4444         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4445     }
4446 
4447     if (bundleInfos_.empty()) {
4448         APP_LOGD("bundleInfos_ data is empty");
4449         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4450     }
4451     APP_LOGD(
4452         "GetInnerBundleInfoWithFlagsV9:bundleName:%{public}s,flags:%{public}d,userId:%{public}d,appIndex:%{public}d",
4453         bundleName.c_str(), flags, userId, appIndex);
4454     auto item = bundleInfos_.find(bundleName);
4455     if (item == bundleInfos_.end()) {
4456         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle not exist -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4457             bundleName.c_str(), userId, appIndex, flags);
4458         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4459     }
4460     const InnerBundleInfo &innerBundleInfo = item->second;
4461     if (innerBundleInfo.IsDisabled()) {
4462         LOG_NOFUNC_E(BMS_TAG_COMMON, "bundle disabled -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4463             bundleName.c_str(), userId, appIndex, flags);
4464         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4465     }
4466 
4467     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4468     bool isEnabled = false;
4469     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4470     if (ret != ERR_OK) {
4471         APP_LOGE_NOFUNC("GetApplicationEnabledV9 failed ret:%{public}d -n %{public}s", ret, bundleName.c_str());
4472         return ret;
4473     }
4474     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_DISABLE))
4475         && !isEnabled) {
4476         LOG_NOFUNC_W(BMS_TAG_COMMON, "set enabled false -n %{public}s -u %{public}d -i %{public}d -f %{public}d",
4477             bundleName.c_str(), responseUserId, appIndex, flags);
4478         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4479     }
4480     info = innerBundleInfo;
4481     return ERR_OK;
4482 }
4483 
GetInnerBundleInfoWithBundleFlagsV9(const std::string & bundleName,const int32_t flags,InnerBundleInfo & info,int32_t userId,int32_t appIndex) const4484 ErrCode BundleDataMgr::GetInnerBundleInfoWithBundleFlagsV9(const std::string &bundleName,
4485     const int32_t flags, InnerBundleInfo &info, int32_t userId, int32_t appIndex) const
4486 {
4487     if (bundleName.empty()) {
4488         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4489     }
4490     int32_t requestUserId = GetUserId(userId);
4491     if (requestUserId == Constants::INVALID_USERID) {
4492         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4493     }
4494 
4495     if (bundleInfos_.empty()) {
4496         APP_LOGW("bundleInfos_ data is empty, bundleName: %{public}s", bundleName.c_str());
4497         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4498     }
4499     APP_LOGD("GetInnerBundleInfoWithFlagsV9: %{public}s", bundleName.c_str());
4500     auto item = bundleInfos_.find(bundleName);
4501     if (item == bundleInfos_.end()) {
4502         APP_LOGW_NOFUNC("%{public}s not find", bundleName.c_str());
4503         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4504     }
4505     const InnerBundleInfo &innerBundleInfo = item->second;
4506     if (innerBundleInfo.IsDisabled()) {
4507         APP_LOGW("bundleName: %{public}s status is disabled", innerBundleInfo.GetBundleName().c_str());
4508         return ERR_BUNDLE_MANAGER_BUNDLE_DISABLED;
4509     }
4510 
4511     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
4512     bool isEnabled = false;
4513     auto ret = innerBundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled, appIndex);
4514     if (ret != ERR_OK) {
4515         return ret;
4516     }
4517     if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE))
4518         && !isEnabled) {
4519         APP_LOGW("bundleName: %{public}s is disabled", innerBundleInfo.GetBundleName().c_str());
4520         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
4521     }
4522     info = innerBundleInfo;
4523     return ERR_OK;
4524 }
4525 
GetInnerBundleInfoWithDisable(const std::string & bundleName,InnerBundleInfo & info)4526 bool BundleDataMgr::GetInnerBundleInfoWithDisable(const std::string &bundleName, InnerBundleInfo &info)
4527 {
4528     APP_LOGD("GetInnerBundleInfoWithDisable %{public}s", bundleName.c_str());
4529     if (bundleName.empty()) {
4530         APP_LOGW("bundleName is empty");
4531         return false;
4532     }
4533 
4534     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4535     auto infoItem = bundleInfos_.find(bundleName);
4536     if (infoItem == bundleInfos_.end()) {
4537         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4538         return false;
4539     }
4540     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4541     info = infoItem->second;
4542     info.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4543     return true;
4544 }
4545 
DisableBundle(const std::string & bundleName)4546 bool BundleDataMgr::DisableBundle(const std::string &bundleName)
4547 {
4548     APP_LOGD("DisableBundle %{public}s", bundleName.c_str());
4549     if (bundleName.empty()) {
4550         APP_LOGW("bundleName empty");
4551         return false;
4552     }
4553 
4554     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4555     auto infoItem = bundleInfos_.find(bundleName);
4556     if (infoItem == bundleInfos_.end()) {
4557         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4558         return false;
4559     }
4560     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::DISABLED);
4561     return true;
4562 }
4563 
EnableBundle(const std::string & bundleName)4564 bool BundleDataMgr::EnableBundle(const std::string &bundleName)
4565 {
4566     APP_LOGD("EnableBundle %{public}s", bundleName.c_str());
4567     if (bundleName.empty()) {
4568         APP_LOGW("bundleName empty");
4569         return false;
4570     }
4571 
4572     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4573     auto infoItem = bundleInfos_.find(bundleName);
4574     if (infoItem == bundleInfos_.end()) {
4575         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4576         return false;
4577     }
4578     infoItem->second.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
4579     return true;
4580 }
4581 
IsApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool & isEnabled,int32_t userId) const4582 ErrCode BundleDataMgr::IsApplicationEnabled(
4583     const std::string &bundleName, int32_t appIndex, bool &isEnabled, int32_t userId) const
4584 {
4585     APP_LOGD("IsApplicationEnabled %{public}s", bundleName.c_str());
4586     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4587     auto infoItem = bundleInfos_.find(bundleName);
4588     if (infoItem == bundleInfos_.end()) {
4589         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4590         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4591     }
4592     int32_t responseUserId = infoItem->second.GetResponseUserId(GetUserId(userId));
4593     if (appIndex == 0) {
4594         ErrCode ret = infoItem->second.GetApplicationEnabledV9(responseUserId, isEnabled);
4595         if (ret != ERR_OK) {
4596             APP_LOGW("GetApplicationEnabled failed: %{public}s", bundleName.c_str());
4597         }
4598         return ret;
4599     }
4600     const InnerBundleInfo &bundleInfo = infoItem->second;
4601     InnerBundleUserInfo innerBundleUserInfo;
4602     if (!bundleInfo.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
4603         APP_LOGW("can not find userId %{public}d", responseUserId);
4604         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
4605     }
4606     auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex));
4607     if (iter == innerBundleUserInfo.cloneInfos.end()) {
4608         APP_LOGW("can not find appIndex %{public}d", appIndex);
4609         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4610     }
4611     isEnabled = iter->second.enabled;
4612     return ERR_OK;
4613 }
4614 
SetApplicationEnabled(const std::string & bundleName,int32_t appIndex,bool isEnable,const std::string & caller,int32_t userId)4615 ErrCode BundleDataMgr::SetApplicationEnabled(const std::string &bundleName,
4616     int32_t appIndex, bool isEnable, const std::string &caller, int32_t userId)
4617 {
4618     APP_LOGD("SetApplicationEnabled %{public}s", bundleName.c_str());
4619     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4620     int32_t requestUserId = GetUserId(userId);
4621     if (requestUserId == Constants::INVALID_USERID) {
4622         APP_LOGW("Request userId %{public}d is invalid, bundleName:%{public}s", userId, bundleName.c_str());
4623         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4624     }
4625     auto infoItem = bundleInfos_.find(bundleName);
4626     if (infoItem == bundleInfos_.end()) {
4627         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4628         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4629     }
4630 
4631     InnerBundleInfo& newInfo = infoItem->second;
4632     if (appIndex != 0) {
4633         auto ret = newInfo.SetCloneApplicationEnabled(isEnable, appIndex, caller, requestUserId);
4634         if (ret != ERR_OK) {
4635             APP_LOGW("SetCloneApplicationEnabled for innerBundleInfo fail, errCode is %{public}d", ret);
4636             return ret;
4637         }
4638         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4639             APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", newInfo.GetBundleName().c_str());
4640             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4641         }
4642         return ERR_OK;
4643     }
4644     auto ret = newInfo.SetApplicationEnabled(isEnable, caller, requestUserId);
4645     if (ret != ERR_OK) {
4646         APP_LOGW("SetApplicationEnabled failed, err %{public}d", ret);
4647         return ret;
4648     }
4649 
4650     InnerBundleUserInfo innerBundleUserInfo;
4651     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4652         APP_LOGW("can not find bundleUserInfo in userId: %{public}d", requestUserId);
4653         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4654     }
4655 
4656     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4657         bundleStateStorage_->DeleteBundleState(bundleName, requestUserId);
4658     } else {
4659         bundleStateStorage_->SaveBundleStateStorage(
4660             bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4661     }
4662     return ERR_OK;
4663 }
4664 
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)4665 bool BundleDataMgr::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
4666 {
4667     if (bundleName.empty() || moduleName.empty()) {
4668         APP_LOGW("bundleName or moduleName is empty");
4669         return false;
4670     }
4671     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4672     if (userId == Constants::INVALID_USERID) {
4673         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4674         return false;
4675     }
4676     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4677         bundleName.c_str(), moduleName.c_str(), userId);
4678     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4679     auto infoItem = bundleInfos_.find(bundleName);
4680     if (infoItem == bundleInfos_.end()) {
4681         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4682         return false;
4683     }
4684     InnerBundleInfo newInfo = infoItem->second;
4685     bool ret = newInfo.SetModuleRemovable(moduleName, isEnable, userId);
4686     if (ret && dataStorage_->SaveStorageBundleInfo(newInfo)) {
4687         ret = infoItem->second.SetModuleRemovable(moduleName, isEnable, userId);
4688 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
4689         if (isEnable) {
4690             // call clean task
4691             APP_LOGD("bundle:%{public}s isEnable:%{public}d ret:%{public}d call clean task",
4692                 bundleName.c_str(), isEnable, ret);
4693             DelayedSingleton<BundleMgrService>::GetInstance()->GetAgingMgr()->Start(
4694                 BundleAgingMgr::AgingTriggertype::UPDATE_REMOVABLE_FLAG);
4695         }
4696 #endif
4697         return ret;
4698     } else {
4699         APP_LOGW("bundle:%{public}s SetModuleRemoved failed", bundleName.c_str());
4700         return false;
4701     }
4702 }
4703 
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable) const4704 ErrCode BundleDataMgr::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
4705     bool &isRemovable) const
4706 {
4707     if (bundleName.empty() || moduleName.empty()) {
4708         APP_LOGW("bundleName or moduleName is empty");
4709         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4710     }
4711     int32_t userId = AccountHelper::GetCurrentActiveUserId();
4712     if (userId == Constants::INVALID_USERID) {
4713         APP_LOGW("get a invalid userid, bundleName: %{public}s", bundleName.c_str());
4714         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4715     }
4716     APP_LOGD("bundleName:%{public}s, moduleName:%{public}s, userId:%{public}d",
4717         bundleName.c_str(), moduleName.c_str(), userId);
4718     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4719     auto infoItem = bundleInfos_.find(bundleName);
4720     if (infoItem == bundleInfos_.end()) {
4721         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4722         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4723     }
4724     InnerBundleInfo newInfo = infoItem->second;
4725     return newInfo.IsModuleRemovable(moduleName, userId, isRemovable);
4726 }
4727 
IsAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool & isEnable) const4728 ErrCode BundleDataMgr::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable) const
4729 {
4730     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4731     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4732     if (infoItem == bundleInfos_.end()) {
4733         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4734         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4735     }
4736     std::vector<int32_t> appIndexVec = GetCloneAppIndexesNoLock(abilityInfo.bundleName, Constants::ALL_USERID);
4737     if ((appIndex != 0) && (std::find(appIndexVec.begin(), appIndexVec.end(), appIndex) == appIndexVec.end())) {
4738         APP_LOGE("appIndex %{public}d is invalid", appIndex);
4739         return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX;
4740     }
4741     InnerBundleInfo innerBundleInfo = infoItem->second;
4742     auto ability = innerBundleInfo.FindAbilityInfoV9(
4743         abilityInfo.moduleName, abilityInfo.name);
4744     if (!ability) {
4745         APP_LOGW("ability not found, bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
4746             abilityInfo.bundleName.c_str(), abilityInfo.moduleName.c_str(), abilityInfo.name.c_str());
4747         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4748     }
4749     int32_t responseUserId = innerBundleInfo.GetResponseUserId(GetUserId());
4750     return innerBundleInfo.IsAbilityEnabledV9((*ability), responseUserId, isEnable, appIndex);
4751 }
4752 
SetAbilityEnabled(const AbilityInfo & abilityInfo,int32_t appIndex,bool isEnabled,int32_t userId)4753 ErrCode BundleDataMgr::SetAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex,
4754     bool isEnabled, int32_t userId)
4755 {
4756     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4757     int32_t requestUserId = GetUserId(userId);
4758     if (requestUserId == Constants::INVALID_USERID) {
4759         APP_LOGW("Request userId is invalid, bundleName:%{public}s, abilityName:%{public}s",
4760             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4761         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4762     }
4763     auto infoItem = bundleInfos_.find(abilityInfo.bundleName);
4764     if (infoItem == bundleInfos_.end()) {
4765         APP_LOGW("can not find bundle %{public}s", abilityInfo.bundleName.c_str());
4766         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4767     }
4768     InnerBundleInfo& newInfo = infoItem->second;
4769     if (appIndex != 0) {
4770         auto ret = newInfo.SetCloneAbilityEnabled(
4771             abilityInfo.moduleName, abilityInfo.name, isEnabled, userId, appIndex);
4772         if (ret != ERR_OK) {
4773             APP_LOGW("SetCloneAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4774                 ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4775             return ret;
4776         }
4777         if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
4778             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", newInfo.GetBundleName().c_str());
4779             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4780         }
4781         return ERR_OK;
4782     }
4783     ErrCode ret = newInfo.SetAbilityEnabled(
4784         abilityInfo.moduleName, abilityInfo.name, isEnabled, userId);
4785     if (ret != ERR_OK) {
4786         APP_LOGW("SetAbilityEnabled failed result: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4787             ret, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4788         return ret;
4789     }
4790     InnerBundleUserInfo innerBundleUserInfo;
4791     if (!newInfo.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo)) {
4792         APP_LOGW("can not find bundleUserInfo in userId: %{public}d, bundleName:%{public}s, abilityName:%{public}s",
4793             requestUserId, abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
4794         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4795     }
4796     if (innerBundleUserInfo.bundleUserInfo.IsInitialState()) {
4797         bundleStateStorage_->DeleteBundleState(abilityInfo.bundleName, requestUserId);
4798     } else {
4799         bundleStateStorage_->SaveBundleStateStorage(
4800             abilityInfo.bundleName, requestUserId, innerBundleUserInfo.bundleUserInfo);
4801     }
4802     return ERR_OK;
4803 }
4804 
GetSandboxAppHelper() const4805 std::shared_ptr<BundleSandboxAppHelper> BundleDataMgr::GetSandboxAppHelper() const
4806 {
4807     return sandboxAppHelper_;
4808 }
4809 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)4810 bool BundleDataMgr::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4811 {
4812     APP_LOGD("RegisterBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4813     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4814     callbackList_.emplace_back(bundleStatusCallback);
4815     if (bundleStatusCallback->AsObject() != nullptr) {
4816         sptr<BundleStatusCallbackDeathRecipient> deathRecipient =
4817             new (std::nothrow) BundleStatusCallbackDeathRecipient();
4818         if (deathRecipient == nullptr) {
4819             APP_LOGW("deathRecipient is null");
4820             return false;
4821         }
4822         bundleStatusCallback->AsObject()->AddDeathRecipient(deathRecipient);
4823     }
4824     return true;
4825 }
4826 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)4827 bool BundleDataMgr::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4828 {
4829     if (bundleEventCallback == nullptr) {
4830         APP_LOGW("bundleEventCallback is null");
4831         return false;
4832     }
4833     std::lock_guard lock(eventCallbackMutex_);
4834     if (eventCallbackList_.size() >= MAX_EVENT_CALL_BACK_SIZE) {
4835         APP_LOGW("eventCallbackList_ reach max size %{public}d", MAX_EVENT_CALL_BACK_SIZE);
4836         return false;
4837     }
4838     if (bundleEventCallback->AsObject() != nullptr) {
4839         sptr<BundleEventCallbackDeathRecipient> deathRecipient =
4840             new (std::nothrow) BundleEventCallbackDeathRecipient();
4841         if (deathRecipient == nullptr) {
4842             APP_LOGW("deathRecipient is null");
4843             return false;
4844         }
4845         bundleEventCallback->AsObject()->AddDeathRecipient(deathRecipient);
4846     }
4847     eventCallbackList_.emplace_back(bundleEventCallback);
4848     return true;
4849 }
4850 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)4851 bool BundleDataMgr::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
4852 {
4853     APP_LOGD("begin to UnregisterBundleEventCallback");
4854     if (bundleEventCallback == nullptr) {
4855         APP_LOGW("bundleEventCallback is null");
4856         return false;
4857     }
4858     std::lock_guard lock(eventCallbackMutex_);
4859     eventCallbackList_.erase(std::remove_if(eventCallbackList_.begin(), eventCallbackList_.end(),
4860         [&bundleEventCallback](const sptr<IBundleEventCallback> &callback) {
4861             return callback->AsObject() == bundleEventCallback->AsObject();
4862         }), eventCallbackList_.end());
4863     return true;
4864 }
4865 
NotifyBundleEventCallback(const EventFwk::CommonEventData & eventData) const4866 void BundleDataMgr::NotifyBundleEventCallback(const EventFwk::CommonEventData &eventData) const
4867 {
4868     APP_LOGD("begin to NotifyBundleEventCallback");
4869     std::lock_guard lock(eventCallbackMutex_);
4870     for (const auto &callback : eventCallbackList_) {
4871         callback->OnReceiveEvent(eventData);
4872     }
4873     APP_LOGD("finish to NotifyBundleEventCallback");
4874 }
4875 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)4876 bool BundleDataMgr::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
4877 {
4878     APP_LOGD("ClearBundleStatusCallback %{public}s", bundleStatusCallback->GetBundleName().c_str());
4879     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4880     callbackList_.erase(std::remove_if(callbackList_.begin(),
4881         callbackList_.end(),
4882         [&](const sptr<IBundleStatusCallback> &callback) {
4883             return callback->AsObject() == bundleStatusCallback->AsObject();
4884         }),
4885         callbackList_.end());
4886     return true;
4887 }
4888 
UnregisterBundleStatusCallback()4889 bool BundleDataMgr::UnregisterBundleStatusCallback()
4890 {
4891     std::unique_lock<std::shared_mutex> lock(callbackMutex_);
4892     callbackList_.clear();
4893     return true;
4894 }
4895 
GenerateUidAndGid(InnerBundleUserInfo & innerBundleUserInfo)4896 bool BundleDataMgr::GenerateUidAndGid(InnerBundleUserInfo &innerBundleUserInfo)
4897 {
4898     if (innerBundleUserInfo.bundleName.empty()) {
4899         APP_LOGW("bundleName is null");
4900         return false;
4901     }
4902 
4903     int32_t bundleId = INVALID_BUNDLEID;
4904     if (!GenerateBundleId(innerBundleUserInfo.bundleName, bundleId)) {
4905         APP_LOGW("Generate bundleId failed, bundleName: %{public}s", innerBundleUserInfo.bundleName.c_str());
4906         return false;
4907     }
4908 
4909     innerBundleUserInfo.uid = innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE
4910         + bundleId % Constants::BASE_USER_RANGE;
4911     innerBundleUserInfo.gids.emplace_back(innerBundleUserInfo.uid);
4912     return true;
4913 }
4914 
GenerateBundleId(const std::string & bundleName,int32_t & bundleId)4915 bool BundleDataMgr::GenerateBundleId(const std::string &bundleName, int32_t &bundleId)
4916 {
4917     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
4918     if (bundleIdMap_.empty()) {
4919         APP_LOGD("first app install");
4920         bundleId = baseAppUid_;
4921         bundleIdMap_.emplace(bundleId, bundleName);
4922         return true;
4923     }
4924 
4925     for (const auto &innerBundleId : bundleIdMap_) {
4926         if (innerBundleId.second == bundleName) {
4927             bundleId = innerBundleId.first;
4928             return true;
4929         }
4930     }
4931 
4932     for (int32_t i = baseAppUid_; i < bundleIdMap_.rbegin()->first; ++i) {
4933         if (bundleIdMap_.find(i) == bundleIdMap_.end()) {
4934             APP_LOGD("the %{public}d app install bundleName:%{public}s", i, bundleName.c_str());
4935             bundleId = i;
4936             bundleIdMap_.emplace(bundleId, bundleName);
4937             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4938             BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4939             return true;
4940         }
4941     }
4942 
4943     if (bundleIdMap_.rbegin()->first == MAX_APP_UID) {
4944         APP_LOGW("the bundleId exceeding the maximum value, bundleName:%{public}s", bundleName.c_str());
4945         return false;
4946     }
4947 
4948     bundleId = bundleIdMap_.rbegin()->first + 1;
4949     bundleIdMap_.emplace(bundleId, bundleName);
4950     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
4951     BundleUtil::MakeFsConfig(bundleName, bundleId, ServiceConstants::SHAREFS_CONFIG_PATH);
4952     return true;
4953 }
4954 
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,const int32_t upgradeFlag)4955 ErrCode BundleDataMgr::SetModuleUpgradeFlag(const std::string &bundleName,
4956     const std::string &moduleName, const int32_t upgradeFlag)
4957 {
4958     APP_LOGD("SetModuleUpgradeFlag %{public}d", upgradeFlag);
4959     if (bundleName.empty() || moduleName.empty()) {
4960         APP_LOGW("bundleName or moduleName is empty");
4961         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4962     }
4963     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
4964     auto infoItem = bundleInfos_.find(bundleName);
4965     if (infoItem == bundleInfos_.end()) {
4966         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4967     }
4968     InnerBundleInfo &newInfo = infoItem->second;
4969     ErrCode setFlag = newInfo.SetModuleUpgradeFlag(moduleName, upgradeFlag);
4970     if (setFlag == ERR_OK) {
4971         if (dataStorage_->SaveStorageBundleInfo(newInfo)) {
4972             return ERR_OK;
4973         }
4974         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
4975     }
4976     APP_LOGW("dataStorage SetModuleUpgradeFlag %{public}s failed", bundleName.c_str());
4977     return setFlag;
4978 }
4979 
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName) const4980 int32_t BundleDataMgr::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName) const
4981 {
4982     APP_LOGD("bundleName is bundleName:%{public}s, moduleName:%{public}s", bundleName.c_str(), moduleName.c_str());
4983     if (bundleName.empty() || moduleName.empty()) {
4984         APP_LOGW("bundleName or moduleName is empty");
4985         return false;
4986     }
4987     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
4988     auto infoItem = bundleInfos_.find(bundleName);
4989     if (infoItem == bundleInfos_.end()) {
4990         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
4991         return false;
4992     }
4993     InnerBundleInfo newInfo = infoItem->second;
4994     return newInfo.GetModuleUpgradeFlag(moduleName);
4995 }
4996 
RecycleUidAndGid(const InnerBundleInfo & info)4997 void BundleDataMgr::RecycleUidAndGid(const InnerBundleInfo &info)
4998 {
4999     auto userInfos = info.GetInnerBundleUserInfos();
5000     if (userInfos.empty()) {
5001         APP_LOGE("user infos is empty");
5002         return;
5003     }
5004 
5005     auto innerBundleUserInfo = userInfos.begin()->second;
5006     int32_t bundleId = innerBundleUserInfo.uid -
5007         innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5008     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5009     auto infoItem = bundleIdMap_.find(bundleId);
5010     if (infoItem == bundleIdMap_.end()) {
5011         return;
5012     }
5013 
5014     UninstallBundleInfo uninstallBundleInfo;
5015     if (GetUninstallBundleInfo(info.GetBundleName(), uninstallBundleInfo)) {
5016         return;
5017     }
5018     bundleIdMap_.erase(bundleId);
5019     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::HMDFS_CONFIG_PATH);
5020     BundleUtil::RemoveFsConfig(innerBundleUserInfo.bundleName, ServiceConstants::SHAREFS_CONFIG_PATH);
5021 }
5022 
RestoreUidAndGid()5023 bool BundleDataMgr::RestoreUidAndGid()
5024 {
5025     for (const auto &info : bundleInfos_) {
5026         bool onlyInsertOne = false;
5027         for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
5028             auto innerBundleUserInfo = infoItem.second;
5029             AddUserId(innerBundleUserInfo.bundleUserInfo.userId);
5030             if (!onlyInsertOne) {
5031                 onlyInsertOne = true;
5032                 int32_t bundleId = innerBundleUserInfo.uid -
5033                     innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
5034                 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5035                 auto item = bundleIdMap_.find(bundleId);
5036                 if (item == bundleIdMap_.end()) {
5037                     bundleIdMap_.emplace(bundleId, innerBundleUserInfo.bundleName);
5038                 } else {
5039                     bundleIdMap_[bundleId] = innerBundleUserInfo.bundleName;
5040                 }
5041                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5042                 BundleUtil::MakeFsConfig(innerBundleUserInfo.bundleName, bundleId,
5043                     ServiceConstants::SHAREFS_CONFIG_PATH);
5044             }
5045             // appClone
5046             std::string bundleName = info.second.GetBundleName();
5047             std::map<std::string, InnerBundleCloneInfo> &clones = innerBundleUserInfo.cloneInfos;
5048             for (auto iter = clones.begin(); iter != clones.end(); iter++) {
5049                 auto &cloneInfo = iter->second;
5050                 int32_t bundleId = cloneInfo.uid - cloneInfo.userId * Constants::BASE_USER_RANGE;
5051                 std::string cloneBundleName =
5052                     BundleCloneCommonHelper::GetCloneBundleIdKey(bundleName, cloneInfo.appIndex);
5053                 std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5054                 auto item = bundleIdMap_.find(bundleId);
5055                 if (item == bundleIdMap_.end()) {
5056                     bundleIdMap_.emplace(bundleId, cloneBundleName);
5057                 } else {
5058                     bundleIdMap_[bundleId] = cloneBundleName;
5059                 }
5060                 BundleUtil::MakeFsConfig(cloneBundleName, bundleId, ServiceConstants::HMDFS_CONFIG_PATH);
5061                 BundleUtil::MakeFsConfig(cloneBundleName, bundleId,
5062                     ServiceConstants::SHAREFS_CONFIG_PATH);
5063             }
5064         }
5065     }
5066     RestoreUidAndGidFromUninstallInfo();
5067     return true;
5068 }
5069 
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)5070 void BundleDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
5071 {
5072     if (sandboxAppHelper_ != nullptr) {
5073         std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
5074         sandboxAppHelper_->RestoreSandboxUidAndGid(bundleIdMap);
5075     }
5076 }
5077 
GetBundleMutex(const std::string & bundleName)5078 std::mutex &BundleDataMgr::GetBundleMutex(const std::string &bundleName)
5079 {
5080     bundleMutex_.lock_shared();
5081     auto it = bundleMutexMap_.find(bundleName);
5082     if (it == bundleMutexMap_.end()) {
5083         bundleMutex_.unlock_shared();
5084         std::unique_lock lock {bundleMutex_};
5085         return bundleMutexMap_[bundleName];
5086     }
5087     bundleMutex_.unlock_shared();
5088     return it->second;
5089 }
5090 
GetProvisionId(const std::string & bundleName,std::string & provisionId) const5091 bool BundleDataMgr::GetProvisionId(const std::string &bundleName, std::string &provisionId) const
5092 {
5093     APP_LOGD("GetProvisionId %{public}s", bundleName.c_str());
5094     if (bundleName.empty()) {
5095         APP_LOGW("bundleName empty");
5096         return false;
5097     }
5098     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5099     auto infoItem = bundleInfos_.find(bundleName);
5100     if (infoItem == bundleInfos_.end()) {
5101         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5102         return false;
5103     }
5104     provisionId = infoItem->second.GetProvisionId();
5105     return true;
5106 }
5107 
GetAppFeature(const std::string & bundleName,std::string & appFeature) const5108 bool BundleDataMgr::GetAppFeature(const std::string &bundleName, std::string &appFeature) const
5109 {
5110     APP_LOGD("GetAppFeature %{public}s", bundleName.c_str());
5111     if (bundleName.empty()) {
5112         APP_LOGW("bundleName empty");
5113         return false;
5114     }
5115     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5116     auto infoItem = bundleInfos_.find(bundleName);
5117     if (infoItem == bundleInfos_.end()) {
5118         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
5119         return false;
5120     }
5121     appFeature = infoItem->second.GetAppFeature();
5122     return true;
5123 }
5124 
SetInitialUserFlag(bool flag)5125 void BundleDataMgr::SetInitialUserFlag(bool flag)
5126 {
5127     APP_LOGD("SetInitialUserFlag %{public}d", flag);
5128     if (!initialUserFlag_ && flag && bundlePromise_ != nullptr) {
5129         bundlePromise_->NotifyAllTasksExecuteFinished();
5130     }
5131 
5132     initialUserFlag_ = flag;
5133 }
5134 
GetDataStorage() const5135 std::shared_ptr<IBundleDataStorage> BundleDataMgr::GetDataStorage() const
5136 {
5137     return dataStorage_;
5138 }
5139 
GetAllFormsInfo(std::vector<FormInfo> & formInfos) const5140 bool BundleDataMgr::GetAllFormsInfo(std::vector<FormInfo> &formInfos) const
5141 {
5142     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5143     if (bundleInfos_.empty()) {
5144         APP_LOGW("bundleInfos_ data is empty");
5145         return false;
5146     }
5147     auto result = false;
5148     for (const auto &item : bundleInfos_) {
5149         if (item.second.IsDisabled()) {
5150             APP_LOGD("app %{public}s is disabled", item.second.GetBundleName().c_str());
5151             continue;
5152         }
5153         item.second.GetFormsInfoByApp(formInfos);
5154         result = true;
5155     }
5156     APP_LOGD("all the form infos find success");
5157     return result;
5158 }
5159 
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos) const5160 bool BundleDataMgr::GetFormsInfoByModule(
5161     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos) const
5162 {
5163     if (bundleName.empty()) {
5164         APP_LOGW("bundle name is empty");
5165         return false;
5166     }
5167     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5168     if (bundleInfos_.empty()) {
5169         APP_LOGW("bundleInfos_ data is empty");
5170         return false;
5171     }
5172     auto infoItem = bundleInfos_.find(bundleName);
5173     if (infoItem == bundleInfos_.end()) {
5174         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5175         return false;
5176     }
5177     if (infoItem->second.IsDisabled()) {
5178         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5179         return false;
5180     }
5181     infoItem->second.GetFormsInfoByModule(moduleName, formInfos);
5182     if (formInfos.empty()) {
5183         return false;
5184     }
5185     APP_LOGD("module forminfo find success");
5186     return true;
5187 }
5188 
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos) const5189 bool BundleDataMgr::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos) const
5190 {
5191     if (bundleName.empty()) {
5192         APP_LOGW("bundle name is empty");
5193         return false;
5194     }
5195     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5196     if (bundleInfos_.empty()) {
5197         APP_LOGW("bundleInfos_ data is empty");
5198         return false;
5199     }
5200     auto infoItem = bundleInfos_.find(bundleName);
5201     if (infoItem == bundleInfos_.end()) {
5202         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
5203         return false;
5204     }
5205     if (infoItem->second.IsDisabled()) {
5206         APP_LOGW("app %{public}s is disabled", infoItem->second.GetBundleName().c_str());
5207         return false;
5208     }
5209     infoItem->second.GetFormsInfoByApp(formInfos);
5210     APP_LOGD("App forminfo find success");
5211     return true;
5212 }
5213 
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5214 bool BundleDataMgr::GetShortcutInfos(
5215     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5216 {
5217     int32_t requestUserId = GetUserId(userId);
5218     if (requestUserId == Constants::INVALID_USERID) {
5219         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5220         return false;
5221     }
5222 
5223     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5224     InnerBundleInfo innerBundleInfo;
5225     if (!GetInnerBundleInfoWithFlags(
5226         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId)) {
5227         APP_LOGW("GetShortcutInfos failed, bundleName:%{public}s, requestUserId:%{public}d",
5228             bundleName.c_str(), requestUserId);
5229         return false;
5230     }
5231     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5232     return true;
5233 }
5234 
TryGetRawDataByExtractor(const std::string & hapPath,const std::string & profileName,const AbilityInfo & abilityInfo) const5235 std::string BundleDataMgr::TryGetRawDataByExtractor(const std::string &hapPath, const std::string &profileName,
5236     const AbilityInfo &abilityInfo) const
5237 {
5238     std::string rawData;
5239     GetJsonProfileByExtractor(hapPath, profileName, rawData);
5240     if (rawData.empty()) { // if get failed ,try get from resmgr
5241         BundleMgrClient bundleMgrClient;
5242         std::vector<std::string> rawJson;
5243         if (!bundleMgrClient.GetResConfigFile(abilityInfo, META_DATA_SHORTCUTS_NAME, rawJson)) {
5244             APP_LOGD("GetResConfigFile return false");
5245             return "";
5246         }
5247         return rawJson.empty() ? "" : rawJson[0];
5248     }
5249     return rawData;
5250 }
5251 
GetShortcutInfosByInnerBundleInfo(const InnerBundleInfo & info,std::vector<ShortcutInfo> & shortcutInfos) const5252 bool BundleDataMgr::GetShortcutInfosByInnerBundleInfo(
5253     const InnerBundleInfo &info, std::vector<ShortcutInfo> &shortcutInfos) const
5254 {
5255     if (!info.GetIsNewVersion()) {
5256         info.GetShortcutInfos(shortcutInfos);
5257         return true;
5258     }
5259     AbilityInfo abilityInfo;
5260     info.GetMainAbilityInfo(abilityInfo);
5261     if (abilityInfo.hapPath.empty() || abilityInfo.metadata.size() <= 0) {
5262         return false;
5263     }
5264     std::string rawData;
5265     for (const auto &meta : abilityInfo.metadata) {
5266         if (meta.name.compare(META_DATA_SHORTCUTS_NAME) == 0) {
5267             std::string resName = meta.resource;
5268             std::string hapPath = abilityInfo.hapPath;
5269             size_t pos = resName.rfind(PROFILE_PREFIX);
5270             bool posValid = (pos != std::string::npos) && (pos != resName.length() - strlen(PROFILE_PREFIX));
5271             if (!posValid) {
5272                 APP_LOGE("resName invalid %{public}s", resName.c_str());
5273                 return false;
5274             }
5275             std::string profileName = PROFILE_PATH + resName.substr(pos + strlen(PROFILE_PREFIX)) + JSON_SUFFIX;
5276             rawData = TryGetRawDataByExtractor(hapPath, profileName, abilityInfo);
5277             break;
5278         }
5279     }
5280     if (rawData.empty()) {
5281         APP_LOGE("shortcutinfo is empty");
5282         return false;
5283     }
5284     nlohmann::json jsonObject = nlohmann::json::parse(rawData, nullptr, false);
5285     if (jsonObject.is_discarded()) {
5286         APP_LOGE("shortcuts json invalid");
5287         return false;
5288     }
5289     ShortcutJson shortcutJson = jsonObject.get<ShortcutJson>();
5290     for (const Shortcut &item : shortcutJson.shortcuts) {
5291         ShortcutInfo shortcutInfo;
5292         shortcutInfo.bundleName = abilityInfo.bundleName;
5293         shortcutInfo.moduleName = abilityInfo.moduleName;
5294         info.InnerProcessShortcut(item, shortcutInfo);
5295         shortcutInfo.sourceType = 1;
5296         APP_LOGI("shortcutInfo: -n %{public}s, id %{public}s, iconId %{public}d, labelId %{public}d",
5297             shortcutInfo.bundleName.c_str(), shortcutInfo.id.c_str(), shortcutInfo.iconId, shortcutInfo.labelId);
5298         shortcutInfos.emplace_back(shortcutInfo);
5299     }
5300     (void)InnerProcessShortcutId(abilityInfo.hapPath, shortcutInfos);
5301     return true;
5302 }
5303 
5304 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & hapPath) const5305 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(const std::string &hapPath) const
5306 {
5307     if (hapPath.empty()) {
5308         APP_LOGE("hapPath is empty");
5309         return nullptr;
5310     }
5311     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
5312     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
5313     if (!resConfig) {
5314         APP_LOGE("resConfig is nullptr");
5315         return nullptr;
5316     }
5317 #ifdef GLOBAL_I18_ENABLE
5318     std::map<std::string, std::string> configs;
5319     OHOS::Global::I18n::LocaleInfo locale(Global::I18n::LocaleConfig::GetEffectiveLanguage(), configs);
5320     resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
5321 #endif
5322     resourceManager->UpdateResConfig(*resConfig);
5323     if (!resourceManager->AddResource(hapPath.c_str(), Global::Resource::SELECT_STRING)) {
5324         APP_LOGW("AddResource failed");
5325     }
5326     return resourceManager;
5327 }
5328 #endif
5329 
InnerProcessShortcutId(const std::string & hapPath,std::vector<ShortcutInfo> & shortcutInfos) const5330 bool BundleDataMgr::InnerProcessShortcutId(const std::string &hapPath, std::vector<ShortcutInfo> &shortcutInfos) const
5331 {
5332 #ifdef GLOBAL_RESMGR_ENABLE
5333     bool needToParseShortcutId = false;
5334     for (const auto &info : shortcutInfos) {
5335         if (info.id.find(RESOURCE_STRING_PREFIX) == 0) {
5336             needToParseShortcutId = true;
5337             break;
5338         }
5339     }
5340     if (!needToParseShortcutId) {
5341         return false;
5342     }
5343     APP_LOGI("shortcut id conatins $string:");
5344     auto resourceManager = GetResourceManager(hapPath);
5345     if (resourceManager == nullptr) {
5346         APP_LOGI("create resource mgr failed");
5347         return false;
5348     }
5349 
5350     for (auto &info : shortcutInfos) {
5351         if (info.id.find(RESOURCE_STRING_PREFIX) != 0) {
5352             continue;
5353         }
5354         int32_t id = static_cast<uint32_t>(atoi(info.id.substr(std::string(RESOURCE_STRING_PREFIX).size()).c_str()));
5355         if (id <= 0) {
5356             APP_LOGE("shortcut id is less than 0");
5357             continue;
5358         }
5359         std::string shortcutId;
5360         OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(id, shortcutId);
5361         if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
5362             APP_LOGE("GetStringById failed, id:%{public}d", id);
5363             continue;
5364         }
5365         info.id = shortcutId;
5366     }
5367     return true;
5368 
5369 #else
5370     return true;
5371 #endif
5372 }
5373 
GetShortcutInfoV9(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos) const5374 ErrCode BundleDataMgr::GetShortcutInfoV9(
5375     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos) const
5376 {
5377     int32_t requestUserId = GetUserId(userId);
5378     if (requestUserId == Constants::INVALID_USERID) {
5379         APP_LOGW("input invalid userid, bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5380         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5381     }
5382     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5383     InnerBundleInfo innerBundleInfo;
5384     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName,
5385         BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
5386     if (ret != ERR_OK) {
5387         APP_LOGD("GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s, requestUserId:%{public}d",
5388             bundleName.c_str(), requestUserId);
5389         return ret;
5390     }
5391 
5392     GetShortcutInfosByInnerBundleInfo(innerBundleInfo, shortcutInfos);
5393     return ERR_OK;
5394 }
5395 
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos) const5396 bool BundleDataMgr::GetAllCommonEventInfo(const std::string &eventKey,
5397     std::vector<CommonEventInfo> &commonEventInfos) const
5398 {
5399     if (eventKey.empty()) {
5400         APP_LOGW("event key is empty");
5401         return false;
5402     }
5403     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5404     if (bundleInfos_.empty()) {
5405         APP_LOGW("bundleInfos_ data is empty");
5406         return false;
5407     }
5408     for (const auto &item : bundleInfos_) {
5409         const InnerBundleInfo &info = item.second;
5410         if (info.IsDisabled()) {
5411             APP_LOGD("app %{public}s is disabled", info.GetBundleName().c_str());
5412             continue;
5413         }
5414         info.GetCommonEvents(eventKey, commonEventInfos);
5415     }
5416     if (commonEventInfos.size() == 0) {
5417         APP_LOGW("commonEventInfos is empty");
5418         return false;
5419     }
5420     APP_LOGE("commonEventInfos find success");
5421     return true;
5422 }
5423 
SavePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5424 bool BundleDataMgr::SavePreInstallBundleInfo(
5425     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5426 {
5427     if (preInstallDataStorage_ == nullptr) {
5428         APP_LOGW("preInstallDataStorage_ is nullptr");
5429         return false;
5430     }
5431 
5432     if (preInstallDataStorage_->SavePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5433         APP_LOGD("write storage success bundle:%{public}s", bundleName.c_str());
5434         return true;
5435     }
5436 
5437     return false;
5438 }
5439 
DeletePreInstallBundleInfo(const std::string & bundleName,const PreInstallBundleInfo & preInstallBundleInfo)5440 bool BundleDataMgr::DeletePreInstallBundleInfo(
5441     const std::string &bundleName, const PreInstallBundleInfo &preInstallBundleInfo)
5442 {
5443     if (preInstallDataStorage_ == nullptr) {
5444         APP_LOGW("preInstallDataStorage_ is nullptr");
5445         return false;
5446     }
5447 
5448     if (preInstallDataStorage_->DeletePreInstallStorageBundleInfo(preInstallBundleInfo)) {
5449         APP_LOGD("Delete PreInstall Storage success bundle:%{public}s", bundleName.c_str());
5450         return true;
5451     }
5452 
5453     return false;
5454 }
5455 
GetPreInstallBundleInfo(const std::string & bundleName,PreInstallBundleInfo & preInstallBundleInfo)5456 bool BundleDataMgr::GetPreInstallBundleInfo(
5457     const std::string &bundleName, PreInstallBundleInfo &preInstallBundleInfo)
5458 {
5459     if (bundleName.empty()) {
5460         APP_LOGW("bundleName is empty");
5461         return false;
5462     }
5463     if (preInstallDataStorage_ == nullptr) {
5464         return false;
5465     }
5466     if (!preInstallDataStorage_->LoadPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
5467         APP_LOGW_NOFUNC("get preInstall bundleInfo failed -n: %{public}s", bundleName.c_str());
5468         return false;
5469     }
5470     return true;
5471 }
5472 
LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> & preInstallBundleInfos)5473 bool BundleDataMgr::LoadAllPreInstallBundleInfos(std::vector<PreInstallBundleInfo> &preInstallBundleInfos)
5474 {
5475     if (preInstallDataStorage_ == nullptr) {
5476         APP_LOGW("preInstallDataStorage_ is nullptr");
5477         return false;
5478     }
5479 
5480     if (preInstallDataStorage_->LoadAllPreInstallBundleInfos(preInstallBundleInfos)) {
5481         APP_LOGD("load all storage success");
5482         return true;
5483     }
5484 
5485     return false;
5486 }
5487 
SaveInnerBundleInfo(const InnerBundleInfo & info) const5488 bool BundleDataMgr::SaveInnerBundleInfo(const InnerBundleInfo &info) const
5489 {
5490     APP_LOGD("write install InnerBundleInfo to storage with bundle:%{public}s", info.GetBundleName().c_str());
5491     if (dataStorage_->SaveStorageBundleInfo(info)) {
5492         APP_LOGD("save install InnerBundleInfo successfully");
5493         return true;
5494     }
5495     APP_LOGW("save install InnerBundleInfo failed, bundleName:%{public}s", info.GetBundleName().c_str());
5496     return false;
5497 }
5498 
GetInnerBundleUserInfoByUserId(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo) const5499 bool BundleDataMgr::GetInnerBundleUserInfoByUserId(const std::string &bundleName,
5500     int32_t userId, InnerBundleUserInfo &innerBundleUserInfo) const
5501 {
5502     APP_LOGD("get user info start: bundleName: (%{public}s)  userId: (%{public}d) ",
5503         bundleName.c_str(), userId);
5504     int32_t requestUserId = GetUserId(userId);
5505     if (requestUserId == Constants::INVALID_USERID) {
5506         return false;
5507     }
5508 
5509     if (bundleName.empty()) {
5510         APP_LOGW("bundle name is empty");
5511         return false;
5512     }
5513 
5514     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5515     if (bundleInfos_.empty()) {
5516         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5517         return false;
5518     }
5519 
5520     auto infoItem = bundleInfos_.find(bundleName);
5521     if (infoItem == bundleInfos_.end()) {
5522         APP_LOGW("bundleName:%{public}s not exist", bundleName.c_str());
5523         return false;
5524     }
5525 
5526     return infoItem->second.GetInnerBundleUserInfo(requestUserId, innerBundleUserInfo);
5527 }
5528 
GetUserId(int32_t userId) const5529 int32_t BundleDataMgr::GetUserId(int32_t userId) const
5530 {
5531     if (userId == Constants::ANY_USERID || userId == Constants::ALL_USERID) {
5532         return userId;
5533     }
5534 
5535     if (userId == Constants::UNSPECIFIED_USERID) {
5536         userId = GetUserIdByCallingUid();
5537     }
5538 
5539     if (!HasUserId(userId)) {
5540         APP_LOGD("user is not existed");
5541         userId = Constants::INVALID_USERID;
5542     }
5543 
5544     return userId;
5545 }
5546 
GetUserIdByUid(int32_t uid) const5547 int32_t BundleDataMgr::GetUserIdByUid(int32_t uid) const
5548 {
5549     return BundleUtil::GetUserIdByUid(uid);
5550 }
5551 
AddUserId(int32_t userId)5552 void BundleDataMgr::AddUserId(int32_t userId)
5553 {
5554     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5555     auto item = multiUserIdsSet_.find(userId);
5556     if (item != multiUserIdsSet_.end()) {
5557         return;
5558     }
5559 
5560     multiUserIdsSet_.insert(userId);
5561 }
5562 
RemoveUserId(int32_t userId)5563 void BundleDataMgr::RemoveUserId(int32_t userId)
5564 {
5565     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5566     auto item = multiUserIdsSet_.find(userId);
5567     if (item == multiUserIdsSet_.end()) {
5568         return;
5569     }
5570 
5571     multiUserIdsSet_.erase(item);
5572 }
5573 
HasUserId(int32_t userId) const5574 bool BundleDataMgr::HasUserId(int32_t userId) const
5575 {
5576     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5577     return multiUserIdsSet_.find(userId) != multiUserIdsSet_.end();
5578 }
5579 
GetUserIdByCallingUid() const5580 int32_t BundleDataMgr::GetUserIdByCallingUid() const
5581 {
5582     return BundleUtil::GetUserIdByCallingUid();
5583 }
5584 
GetAllUser() const5585 std::set<int32_t> BundleDataMgr::GetAllUser() const
5586 {
5587     std::lock_guard<std::mutex> lock(multiUserIdSetMutex_);
5588     return multiUserIdsSet_;
5589 }
5590 
CreateAppInstallDir(int32_t userId)5591 void BundleDataMgr::CreateAppInstallDir(int32_t userId)
5592 {
5593     std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5594         ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5595     ErrCode ret = InstalldClient::GetInstance()->Mkdir(path,
5596         S_IRWXU | S_IRWXG | S_IXOTH | S_ISGID,
5597         Constants::FOUNDATION_UID, ServiceConstants::APP_INSTALL_GID);
5598     if (ret != ERR_OK) {
5599         APP_LOGE("create app install %{public}d failed", userId);
5600     }
5601 }
5602 
RemoveAppInstallDir(int32_t userId)5603 void BundleDataMgr::RemoveAppInstallDir(int32_t userId)
5604 {
5605     std::string path = std::string(ServiceConstants::HAP_COPY_PATH) +
5606         ServiceConstants::GALLERY_DOWNLOAD_PATH + std::to_string(userId);
5607     ErrCode ret = InstalldClient::GetInstance()->RemoveDir(path);
5608     if (ret != ERR_OK) {
5609         APP_LOGE("remove app install %{public}d failed", userId);
5610     }
5611 }
5612 
GetInnerBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos) const5613 bool BundleDataMgr::GetInnerBundleUserInfos(
5614     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos) const
5615 {
5616     APP_LOGD("get all user info in bundle(%{public}s)", bundleName.c_str());
5617     if (bundleName.empty()) {
5618         APP_LOGW("bundle name is empty");
5619         return false;
5620     }
5621 
5622     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5623     if (bundleInfos_.empty()) {
5624         APP_LOGW("bundleInfos data is empty, bundleName:%{public}s", bundleName.c_str());
5625         return false;
5626     }
5627 
5628     auto infoItem = bundleInfos_.find(bundleName);
5629     if (infoItem == bundleInfos_.end()) {
5630         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
5631         return false;
5632     }
5633 
5634     for (auto userInfo : infoItem->second.GetInnerBundleUserInfos()) {
5635         innerBundleUserInfos.emplace_back(userInfo.second);
5636     }
5637 
5638     return !innerBundleUserInfos.empty();
5639 }
5640 
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)5641 std::string BundleDataMgr::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
5642 {
5643     APP_LOGD("GetAppPrivilegeLevel:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
5644     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5645     InnerBundleInfo info;
5646     if (!GetInnerBundleInfoWithFlags(bundleName, 0, info, userId)) {
5647         return Constants::EMPTY_STRING;
5648     }
5649 
5650     return info.GetAppPrivilegeLevel();
5651 }
5652 
QueryExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5653 bool BundleDataMgr::QueryExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
5654     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5655 {
5656     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5657     int32_t requestUserId = GetUserId(userId);
5658     if (requestUserId == Constants::INVALID_USERID) {
5659         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5660         return false;
5661     }
5662 
5663     ElementName element = want.GetElement();
5664     std::string bundleName = element.GetBundleName();
5665     std::string extensionName = element.GetAbilityName();
5666     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s extensionName:%{public}s",
5667         bundleName.c_str(), extensionName.c_str());
5668     // explicit query
5669     if (!bundleName.empty() && !extensionName.empty()) {
5670         ExtensionAbilityInfo info;
5671         bool ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
5672         if (!ret) {
5673             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension error -n %{public}s -e %{public}s -u %{public}d"
5674                 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5675             return false;
5676         }
5677         extensionInfos.emplace_back(info);
5678         return true;
5679     }
5680 
5681     bool ret = ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
5682     if (!ret) {
5683         LOG_D(BMS_TAG_QUERY,
5684             "implicit queryExtension error action:%{public}s uri:%{private}s type:%{public}s"
5685             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5686             requestUserId);
5687         return false;
5688     }
5689     if (extensionInfos.size() == 0) {
5690         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5691             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5692             requestUserId);
5693         return false;
5694     }
5695     LOG_D(BMS_TAG_QUERY, "query extensionAbilityInfo successfully");
5696     return true;
5697 }
5698 
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5699 ErrCode BundleDataMgr::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
5700     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5701 {
5702     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5703     int32_t requestUserId = GetUserId(userId);
5704     if (requestUserId == Constants::INVALID_USERID) {
5705         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5706     }
5707 
5708     ElementName element = want.GetElement();
5709     std::string bundleName = element.GetBundleName();
5710     std::string extensionName = element.GetAbilityName();
5711     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
5712         bundleName.c_str(), extensionName.c_str());
5713     // explicit query
5714     if (!bundleName.empty() && !extensionName.empty()) {
5715         ExtensionAbilityInfo info;
5716         ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
5717         if (ret != ERR_OK) {
5718             LOG_NOFUNC_W(BMS_TAG_QUERY, "ExplicitQueryExtension V9 error -n %{public}s -e %{public}s -u %{public}d"
5719                 " -i %{public}d", bundleName.c_str(), extensionName.c_str(), userId, appIndex);
5720             return ret;
5721         }
5722         extensionInfos.emplace_back(info);
5723         return ERR_OK;
5724     }
5725     ErrCode ret = ImplicitQueryExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
5726     if (ret != ERR_OK) {
5727         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionInfosV9 error");
5728         return ret;
5729     }
5730     if (extensionInfos.empty()) {
5731         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo action:%{public}s uri:%{private}s type:%{public}s"
5732             " userId:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str(),
5733             requestUserId);
5734         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5735     }
5736     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 success");
5737     return ERR_OK;
5738 }
5739 
QueryExtensionAbilityInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5740 ErrCode BundleDataMgr::QueryExtensionAbilityInfos(uint32_t flags, int32_t userId,
5741     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5742 {
5743     int32_t requestUserId = GetUserId(userId);
5744     if (requestUserId == Constants::INVALID_USERID) {
5745         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
5746         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5747     }
5748 
5749     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5750     ErrCode ret = ImplicitQueryAllExtensionInfos(flags, requestUserId, extensionInfos, appIndex);
5751     if (ret != ERR_OK) {
5752         LOG_D(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
5753         return ret;
5754     }
5755     if (extensionInfos.empty()) {
5756         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5757         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5758     }
5759     LOG_D(BMS_TAG_QUERY, "success");
5760     return ERR_OK;
5761 }
5762 
QueryExtensionAbilityInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5763 ErrCode BundleDataMgr::QueryExtensionAbilityInfosByExtensionTypeName(const std::string &typeName,
5764     uint32_t flags, int32_t userId,
5765     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5766 {
5767     LOG_I(BMS_TAG_QUERY, "query failed %{public}s %{public}d", typeName.c_str(), userId);
5768     int32_t requestUserId = GetUserId(userId);
5769     if (requestUserId == Constants::INVALID_USERID) {
5770         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5771     }
5772     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5773     ErrCode ret = ImplicitQueryAllExtensionInfos(
5774         flags, requestUserId, extensionInfos, appIndex, typeName);
5775     if (ret != ERR_OK) {
5776         LOG_W(BMS_TAG_QUERY, "ImplicitQueryAllExtensionInfos error: %{public}d", ret);
5777         return ret;
5778     }
5779     if (extensionInfos.empty()) {
5780         LOG_W(BMS_TAG_QUERY, "no matching abilityInfo");
5781         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5782     }
5783     LOG_D(BMS_TAG_QUERY, "success");
5784     return ERR_OK;
5785 }
5786 
GetOneExtensionInfosByExtensionTypeName(const std::string & typeName,uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const5787 void BundleDataMgr::GetOneExtensionInfosByExtensionTypeName(const std::string &typeName, uint32_t flags, int32_t userId,
5788     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
5789 {
5790     auto extensionInfos = info.GetInnerExtensionInfos();
5791     for (const auto &extensionAbilityInfo : extensionInfos) {
5792         if (typeName != extensionAbilityInfo.second.extensionTypeName) {
5793             continue;
5794         }
5795         infos.emplace_back(extensionAbilityInfo.second);
5796         return;
5797     }
5798 }
5799 
ExplicitQueryExtensionInfo(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const5800 bool BundleDataMgr::ExplicitQueryExtensionInfo(const Want &want, int32_t flags, int32_t userId,
5801     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5802 {
5803     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5804     ElementName element = want.GetElement();
5805     std::string bundleName = element.GetBundleName();
5806     std::string moduleName = element.GetModuleName();
5807     std::string extensionName = element.GetAbilityName();
5808     int32_t requestUserId = GetUserId(userId);
5809     if (requestUserId == Constants::INVALID_USERID) {
5810         return false;
5811     }
5812     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5813     InnerBundleInfo innerBundleInfo;
5814     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId))) {
5815         LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5816         return false;
5817     }
5818     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5819         if (sandboxAppHelper_ == nullptr) {
5820             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5821             return false;
5822         }
5823         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5824         if (ret != ERR_OK) {
5825             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5826             return false;
5827         }
5828     }
5829     if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5830         bool res = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5831         if (!res) {
5832             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfo failed");
5833             return false;
5834         }
5835     }
5836     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5837     if (!extension) {
5838         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5839         return false;
5840     }
5841     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_PERMISSION) != GET_ABILITY_INFO_WITH_PERMISSION) {
5842         extension->permissions.clear();
5843     }
5844     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_METADATA) != GET_ABILITY_INFO_WITH_METADATA) {
5845         extension->metadata.clear();
5846     }
5847     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_SKILL) != GET_ABILITY_INFO_WITH_SKILL) {
5848         extension->skills.clear();
5849     }
5850     extensionInfo = (*extension);
5851     if ((static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_APPLICATION) == GET_ABILITY_INFO_WITH_APPLICATION) {
5852         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5853         innerBundleInfo.GetApplicationInfo(ApplicationFlag::GET_BASIC_APPLICATION_INFO |
5854             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
5855             extensionInfo.applicationInfo, appIndex);
5856     }
5857     // set uid for NAPI cache use
5858     InnerBundleUserInfo innerBundleUserInfo;
5859     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5860         extensionInfo.uid = innerBundleUserInfo.uid;
5861         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5862             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5863             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5864                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5865                 extensionInfo.uid = cloneInfo.uid;
5866             }
5867         }
5868     }
5869     extensionInfo.appIndex = appIndex;
5870     return true;
5871 }
5872 
ExplicitQueryExtensionInfoV9(const Want & want,int32_t flags,int32_t userId,ExtensionAbilityInfo & extensionInfo,int32_t appIndex) const5873 ErrCode BundleDataMgr::ExplicitQueryExtensionInfoV9(const Want &want, int32_t flags, int32_t userId,
5874     ExtensionAbilityInfo &extensionInfo, int32_t appIndex) const
5875 {
5876     ElementName element = want.GetElement();
5877     std::string bundleName = element.GetBundleName();
5878     std::string moduleName = element.GetModuleName();
5879     std::string extensionName = element.GetAbilityName();
5880     LOG_D(BMS_TAG_QUERY, "bundleName:%{public}s, moduleName:%{public}s, abilityName:%{public}s",
5881         bundleName.c_str(), moduleName.c_str(), extensionName.c_str());
5882     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d, appIndex:%{public}d",
5883         flags, userId, appIndex);
5884     int32_t requestUserId = GetUserId(userId);
5885     if (requestUserId == Constants::INVALID_USERID) {
5886         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
5887     }
5888     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5889     InnerBundleInfo innerBundleInfo;
5890     if (appIndex == 0) {
5891         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId);
5892         if (ret != ERR_OK) {
5893             LOG_D(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5894             return ret;
5895         }
5896     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5897         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
5898         if (ret != ERR_OK) {
5899             LOG_W(BMS_TAG_QUERY, "ExplicitQueryExtensionInfoV9 failed");
5900             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5901         }
5902     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
5903         if (sandboxAppHelper_ == nullptr) {
5904             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
5905             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5906         }
5907         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
5908         if (ret != ERR_OK) {
5909             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
5910             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5911         }
5912     }
5913     auto extension = innerBundleInfo.FindExtensionInfo(moduleName, extensionName);
5914     if (!extension) {
5915         LOG_W(BMS_TAG_QUERY, "extensionAbility not found or disabled");
5916         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
5917     }
5918     if ((static_cast<uint32_t>(flags) &
5919         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
5920         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
5921         extension->permissions.clear();
5922     }
5923     if ((static_cast<uint32_t>(flags) &
5924         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
5925         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
5926         extension->metadata.clear();
5927     }
5928     if ((static_cast<uint32_t>(flags) &
5929         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
5930         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
5931         extension->skills.clear();
5932     }
5933     extensionInfo = (*extension);
5934     if ((static_cast<uint32_t>(flags) &
5935         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
5936         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
5937         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
5938         innerBundleInfo.GetApplicationInfoV9(
5939             static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT),
5940             responseUserId, extensionInfo.applicationInfo, appIndex);
5941     }
5942     // set uid for NAPI cache use
5943     InnerBundleUserInfo innerBundleUserInfo;
5944     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
5945         extensionInfo.uid = innerBundleUserInfo.uid;
5946         if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
5947             std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex);
5948             if (innerBundleUserInfo.cloneInfos.find(key) != innerBundleUserInfo.cloneInfos.end()) {
5949                 auto cloneInfo = innerBundleUserInfo.cloneInfos.at(key);
5950                 extensionInfo.uid = cloneInfo.uid;
5951             }
5952         }
5953     }
5954     extensionInfo.appIndex = appIndex;
5955     return ERR_OK;
5956 }
5957 
FilterExtensionAbilityInfosByModuleName(const std::string & moduleName,std::vector<ExtensionAbilityInfo> & extensionInfos) const5958 void BundleDataMgr::FilterExtensionAbilityInfosByModuleName(const std::string &moduleName,
5959     std::vector<ExtensionAbilityInfo> &extensionInfos) const
5960 {
5961     LOG_D(BMS_TAG_QUERY, "FilterExtensionAbilityInfos moduleName: %{public}s", moduleName.c_str());
5962     if (moduleName.empty()) {
5963         return;
5964     }
5965     for (auto iter = extensionInfos.begin(); iter != extensionInfos.end();) {
5966         if (iter->moduleName != moduleName) {
5967             iter = extensionInfos.erase(iter);
5968         } else {
5969             ++iter;
5970         }
5971     }
5972 }
5973 
ImplicitQueryExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const5974 bool BundleDataMgr::ImplicitQueryExtensionInfos(const Want &want, int32_t flags, int32_t userId,
5975     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
5976 {
5977     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
5978     if (want.GetAction().empty() && want.GetEntities().empty()
5979         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
5980         LOG_W(BMS_TAG_QUERY, "param invalid");
5981         return false;
5982     }
5983     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
5984         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
5985     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
5986 
5987     int32_t requestUserId = GetUserId(userId);
5988     if (requestUserId == Constants::INVALID_USERID) {
5989         return false;
5990     }
5991     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
5992     std::string bundleName = want.GetElement().GetBundleName();
5993     if (!bundleName.empty()) {
5994         // query in current bundle
5995         if (!ImplicitQueryCurExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex)) {
5996             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtension failed, bundleName:%{public}s",
5997                 bundleName.c_str());
5998             return false;
5999         }
6000     } else {
6001         // query all
6002         ImplicitQueryAllExtensionInfos(want, flags, requestUserId, extensionInfos, appIndex);
6003     }
6004     // sort by priority, descending order.
6005     if (extensionInfos.size() > 1) {
6006         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6007             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6008     }
6009     return true;
6010 }
6011 
ImplicitQueryExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos,int32_t appIndex) const6012 ErrCode BundleDataMgr::ImplicitQueryExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6013     std::vector<ExtensionAbilityInfo> &extensionInfos, int32_t appIndex) const
6014 {
6015     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6016     if (want.GetAction().empty() && want.GetEntities().empty()
6017         && want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
6018         LOG_W(BMS_TAG_QUERY, "param invalid");
6019         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6020     }
6021     LOG_D(BMS_TAG_QUERY, "action:%{public}s, uri:%{private}s, type:%{public}s",
6022         want.GetAction().c_str(), want.GetUriString().c_str(), want.GetType().c_str());
6023     LOG_D(BMS_TAG_QUERY, "flags:%{public}d, userId:%{public}d", flags, userId);
6024 
6025     int32_t requestUserId = GetUserId(userId);
6026     if (requestUserId == Constants::INVALID_USERID) {
6027         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6028     }
6029     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6030     std::string bundleName = want.GetElement().GetBundleName();
6031     if (!bundleName.empty()) {
6032         // query in current bundle
6033         ErrCode ret = ImplicitQueryCurExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6034         if (ret != ERR_OK) {
6035             LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurExtensionInfos failed, bundleName:%{public}s",
6036                 bundleName.c_str());
6037             return ret;
6038         }
6039     } else {
6040         // query all
6041         ImplicitQueryAllExtensionInfosV9(want, flags, requestUserId, extensionInfos, appIndex);
6042     }
6043     // sort by priority, descending order.
6044     if (extensionInfos.size() > 1) {
6045         std::stable_sort(extensionInfos.begin(), extensionInfos.end(),
6046             [](ExtensionAbilityInfo a, ExtensionAbilityInfo b) { return a.priority > b.priority; });
6047     }
6048     return ERR_OK;
6049 }
6050 
ImplicitQueryCurExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6051 bool BundleDataMgr::ImplicitQueryCurExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6052     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6053 {
6054     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6055     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfos");
6056     std::string bundleName = want.GetElement().GetBundleName();
6057     InnerBundleInfo innerBundleInfo;
6058     if ((appIndex == 0) && (!GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId))) {
6059         LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6060             bundleName.c_str());
6061         return false;
6062     }
6063     if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6064         if (sandboxAppHelper_ == nullptr) {
6065             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6066             return false;
6067         }
6068         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6069         if (ret != ERR_OK) {
6070             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6071             return false;
6072         }
6073     }
6074     if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6075         bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId, appIndex);
6076         if (!ret) {
6077             LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed errCode %{public}d", ret);
6078             return false;
6079         }
6080     }
6081     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6082     GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6083     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6084     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfos");
6085     return true;
6086 }
6087 
ImplicitQueryCurExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6088 ErrCode BundleDataMgr::ImplicitQueryCurExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6089     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6090 {
6091     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6092     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryCurExtensionInfosV9");
6093     std::string bundleName = want.GetElement().GetBundleName();
6094     InnerBundleInfo innerBundleInfo;
6095     if (appIndex == 0) {
6096         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
6097         if (ret != ERR_OK) {
6098             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6099                 bundleName.c_str());
6100             return ret;
6101         }
6102     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6103         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId, appIndex);
6104         if (ret != ERR_OK) {
6105             LOG_W(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6106                 bundleName.c_str());
6107             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6108         }
6109     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6110         if (sandboxAppHelper_ == nullptr) {
6111             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6112             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6113         }
6114         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, userId, innerBundleInfo);
6115         if (ret != ERR_OK) {
6116             LOG_D(BMS_TAG_QUERY, "GetSandboxAppInfo failed errCode %{public}d", ret);
6117             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6118         }
6119     }
6120     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6121     GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6122     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
6123     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryCurExtensionInfosV9");
6124     return ERR_OK;
6125 }
6126 
ImplicitQueryAllExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6127 void BundleDataMgr::ImplicitQueryAllExtensionInfos(const Want &want, int32_t flags, int32_t userId,
6128     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6129 {
6130     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6131     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6132     int32_t requestUserId = GetUserId(userId);
6133     if (requestUserId == Constants::INVALID_USERID) {
6134         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", userId);
6135         return;
6136     }
6137 
6138     // query from bundleInfos_
6139     if (appIndex == 0) {
6140         for (const auto &item : bundleInfos_) {
6141             const InnerBundleInfo &innerBundleInfo = item.second;
6142             int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6143             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId) != ERR_OK) {
6144                 continue;
6145             }
6146             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos);
6147         }
6148     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6149         // query from sandbox manager for sandbox bundle
6150         if (sandboxAppHelper_ == nullptr) {
6151             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6152             return;
6153         }
6154         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6155         for (const auto &item : sandboxMap) {
6156             InnerBundleInfo info;
6157             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6158             if (pos == std::string::npos) {
6159                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6160                 continue;
6161             }
6162             std::string innerBundleName = item.first.substr(pos + 1);
6163             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6164                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6165                 continue;
6166             }
6167 
6168             int32_t responseUserId = info.GetResponseUserId(userId);
6169             GetMatchExtensionInfos(want, flags, responseUserId, info, infos);
6170         }
6171     } else if (appIndex > Constants::INITIAL_APP_INDEX && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6172         LOG_D(BMS_TAG_QUERY, "start to query extensionAbility in appClone");
6173         for (const auto &item : bundleInfos_) {
6174             int32_t responseUserId = item.second.GetResponseUserId(requestUserId);
6175             const InnerBundleInfo &innerBundleInfo = item.second;
6176             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6177                 LOG_D(BMS_TAG_QUERY,
6178                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6179                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6180                 continue;
6181             }
6182             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6183         }
6184     }
6185     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6186 }
6187 
ImplicitQueryAllExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6188 void BundleDataMgr::ImplicitQueryAllExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6189     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6190 {
6191     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6192     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfosV9");
6193     // query from bundleInfos_
6194     if (appIndex == 0) {
6195         for (const auto &item : bundleInfos_) {
6196             const InnerBundleInfo &innerBundleInfo = item.second;
6197             ErrCode ret = CheckBundleAndAbilityDisabled(innerBundleInfo, flags, userId);
6198             if (ret != ERR_OK) {
6199                 LOG_D(BMS_TAG_QUERY, "ImplicitQueryExtensionAbilityInfos failed, bundleName:%{public}s",
6200                     item.first.c_str());
6201                 continue;
6202             }
6203             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6204             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos);
6205         }
6206     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6207         for (const auto &item : bundleInfos_) {
6208             const InnerBundleInfo &innerBundleInfo = item.second;
6209             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6210             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
6211                 LOG_D(BMS_TAG_QUERY,
6212                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
6213                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
6214                 continue;
6215             }
6216             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
6217         }
6218     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6219         // query from sandbox manager for sandbox bundle
6220         if (sandboxAppHelper_ == nullptr) {
6221             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6222             return;
6223         }
6224         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6225         for (const auto &item : sandboxMap) {
6226             InnerBundleInfo info;
6227             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6228             if (pos == std::string::npos) {
6229                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6230                 continue;
6231             }
6232             std::string innerBundleName = item.first.substr(pos + 1);
6233             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6234                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6235                 continue;
6236             }
6237 
6238             int32_t responseUserId = info.GetResponseUserId(userId);
6239             GetMatchExtensionInfosV9(want, flags, responseUserId, info, infos);
6240         }
6241     }
6242     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfosV9");
6243 }
6244 
GetExtensionAbilityInfoByTypeName(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,const std::string & typeName) const6245 void BundleDataMgr::GetExtensionAbilityInfoByTypeName(uint32_t flags, int32_t userId,
6246     std::vector<ExtensionAbilityInfo> &infos, const std::string &typeName) const
6247 {
6248     for (const auto &item : bundleInfos_) {
6249         if ((flags &
6250                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
6251                 static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
6252             if (item.second.GetInnerExtensionInfos().empty() || !item.second.IsSystemApp()) {
6253                 continue;
6254             }
6255             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, userId);
6256             if (!ret) {
6257                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6258                     item.first.c_str());
6259                 continue;
6260             }
6261             int32_t responseUserId = item.second.GetResponseUserId(userId);
6262             GetOneExtensionInfosByExtensionTypeName(typeName, flags, responseUserId, item.second, infos);
6263             if (infos.size() > 0) {
6264                 return;
6265             }
6266         } else {
6267             InnerBundleInfo innerBundleInfo;
6268             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId);
6269             if (!ret) {
6270                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6271                     item.first.c_str());
6272                 continue;
6273             }
6274             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6275             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos);
6276         }
6277     }
6278 }
6279 
ImplicitQueryAllExtensionInfos(uint32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex,const std::string & typeName) const6280 ErrCode BundleDataMgr::ImplicitQueryAllExtensionInfos(uint32_t flags, int32_t userId,
6281     std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex, const std::string &typeName) const
6282 {
6283     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllExtensionInfos");
6284     // query from bundleInfos_
6285     if (appIndex == 0) {
6286         GetExtensionAbilityInfoByTypeName(flags, userId, infos, typeName);
6287     } else if (appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) {
6288         // query from sandbox manager for sandbox bundle
6289         if (sandboxAppHelper_ == nullptr) {
6290             LOG_W(BMS_TAG_QUERY, "sandboxAppHelper_ is nullptr");
6291             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
6292         }
6293         auto sandboxMap = sandboxAppHelper_->GetSandboxAppInfoMap();
6294         for (const auto &item : sandboxMap) {
6295             InnerBundleInfo info;
6296             size_t pos = item.first.rfind(Constants::FILE_UNDERLINE);
6297             if (pos == std::string::npos) {
6298                 LOG_W(BMS_TAG_QUERY, "sandbox map contains invalid element");
6299                 continue;
6300             }
6301             std::string innerBundleName = item.first.substr(pos + 1);
6302             if (sandboxAppHelper_->GetSandboxAppInfo(innerBundleName, appIndex, userId, info) != ERR_OK) {
6303                 LOG_D(BMS_TAG_QUERY, "obtain innerBundleInfo of sandbox app failed");
6304                 continue;
6305             }
6306             int32_t responseUserId = info.GetResponseUserId(userId);
6307             GetAllExtensionInfos(flags, responseUserId, info, infos, appIndex);
6308         }
6309     } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) {
6310         for (const auto &item : bundleInfos_) {
6311             InnerBundleInfo innerBundleInfo;
6312             bool ret = GetInnerBundleInfoWithFlags(item.first, flags, innerBundleInfo, userId, appIndex);
6313             if (!ret) {
6314                 LOG_D(BMS_TAG_QUERY, "GetInnerBundleInfoWithFlagsV9 failed, bundleName:%{public}s",
6315                     item.first.c_str());
6316                 continue;
6317             }
6318             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6319             GetAllExtensionInfos(flags, responseUserId, innerBundleInfo, infos, appIndex);
6320         }
6321     }
6322     LOG_D(BMS_TAG_QUERY, "finish to ImplicitQueryAllExtensionInfos");
6323     return ERR_OK;
6324 }
6325 
GetMatchExtensionInfos(const Want & want,int32_t flags,const int32_t & userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6326 void BundleDataMgr::GetMatchExtensionInfos(const Want &want, int32_t flags, const int32_t &userId,
6327     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6328 {
6329     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6330     auto extensionSkillInfos = info.GetExtensionSkillInfos();
6331     auto extensionInfos = info.GetInnerExtensionInfos();
6332     for (const auto &skillInfos : extensionSkillInfos) {
6333         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6334             const Skill &skill = skillInfos.second[skillIndex];
6335             size_t matchUriIndex = 0;
6336             if (!skill.Match(want, matchUriIndex)) {
6337                 continue;
6338             }
6339             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6340                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6341                     skillInfos.first.c_str());
6342                 break;
6343             }
6344             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6345             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_APPLICATION) ==
6346                 GET_EXTENSION_INFO_WITH_APPLICATION) {
6347                 info.GetApplicationInfo(
6348                     ApplicationFlag::GET_BASIC_APPLICATION_INFO |
6349                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId,
6350                     extensionInfo.applicationInfo);
6351             }
6352             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_PERMISSION) !=
6353                 GET_EXTENSION_INFO_WITH_PERMISSION) {
6354                 extensionInfo.permissions.clear();
6355             }
6356             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_METADATA) != GET_EXTENSION_INFO_WITH_METADATA) {
6357                 extensionInfo.metadata.clear();
6358             }
6359             if ((static_cast<uint32_t>(flags) & GET_EXTENSION_INFO_WITH_SKILL) != GET_EXTENSION_INFO_WITH_SKILL) {
6360                 extensionInfo.skills.clear();
6361             }
6362             if ((static_cast<uint32_t>(flags) &
6363                 GET_EXTENSION_INFO_WITH_SKILL_URI) == GET_EXTENSION_INFO_WITH_SKILL_URI) {
6364                 AddSkillUrisInfo(skillInfos.second, extensionInfo.skillUri, skillIndex, matchUriIndex);
6365             }
6366             extensionInfo.appIndex = appIndex;
6367             infos.emplace_back(extensionInfo);
6368             break;
6369         }
6370     }
6371 }
6372 
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) const6373 void BundleDataMgr::EmplaceExtensionInfo(const InnerBundleInfo &info, const std::vector<Skill> &skills,
6374     ExtensionAbilityInfo &extensionInfo, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos,
6375     std::optional<size_t> matchSkillIndex, std::optional<size_t> matchUriIndex, int32_t appIndex) const
6376 {
6377     if ((static_cast<uint32_t>(flags) &
6378         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6379         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6380         info.GetApplicationInfoV9(static_cast<int32_t>(
6381             GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6382     }
6383     if ((static_cast<uint32_t>(flags) &
6384         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6385         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6386         extensionInfo.permissions.clear();
6387     }
6388     if ((static_cast<uint32_t>(flags) &
6389         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6390         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6391         extensionInfo.metadata.clear();
6392     }
6393     if ((static_cast<uint32_t>(flags) &
6394         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6395         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6396         extensionInfo.skills.clear();
6397     }
6398     if ((static_cast<uint32_t>(flags) &
6399         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) ==
6400         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL_URI)) {
6401         AddSkillUrisInfo(skills, extensionInfo.skillUri, matchSkillIndex, matchUriIndex);
6402     }
6403     extensionInfo.appIndex = appIndex;
6404     infos.emplace_back(extensionInfo);
6405 }
6406 
GetMatchExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6407 void BundleDataMgr::GetMatchExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
6408     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6409 {
6410     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
6411     auto extensionSkillInfos = info.GetExtensionSkillInfos();
6412     auto extensionInfos = info.GetInnerExtensionInfos();
6413     for (const auto &skillInfos : extensionSkillInfos) {
6414         if (want.GetAction() == SHARE_ACTION) {
6415             if (!MatchShare(want, skillInfos.second)) {
6416                 continue;
6417             }
6418             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6419                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6420                     skillInfos.first.c_str());
6421                 continue;
6422             }
6423             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6424             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6425                 std::nullopt, std::nullopt, appIndex);
6426             continue;
6427         }
6428         for (size_t skillIndex = 0; skillIndex < skillInfos.second.size(); ++skillIndex) {
6429             const Skill &skill = skillInfos.second[skillIndex];
6430             size_t matchUriIndex = 0;
6431             if (!skill.Match(want, matchUriIndex)) {
6432                 continue;
6433             }
6434             if (extensionInfos.find(skillInfos.first) == extensionInfos.end()) {
6435                 LOG_W(BMS_TAG_QUERY, "cannot find the extension info with %{public}s",
6436                     skillInfos.first.c_str());
6437                 break;
6438             }
6439             ExtensionAbilityInfo extensionInfo = extensionInfos[skillInfos.first];
6440             EmplaceExtensionInfo(info, skillInfos.second, extensionInfo, flags, userId, infos,
6441                 skillIndex, matchUriIndex, appIndex);
6442             break;
6443         }
6444     }
6445 }
6446 
GetAllExtensionInfos(uint32_t flags,int32_t userId,const InnerBundleInfo & info,std::vector<ExtensionAbilityInfo> & infos,int32_t appIndex) const6447 void BundleDataMgr::GetAllExtensionInfos(uint32_t flags, int32_t userId,
6448     const InnerBundleInfo &info, std::vector<ExtensionAbilityInfo> &infos, int32_t appIndex) const
6449 {
6450     auto extensionInfos = info.GetInnerExtensionInfos();
6451     for (const auto &extensionAbilityInfo : extensionInfos) {
6452         ExtensionAbilityInfo extensionInfo = extensionAbilityInfo.second;
6453         if ((flags &
6454             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) ==
6455             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_APPLICATION)) {
6456             info.GetApplicationInfoV9(static_cast<int32_t>(
6457                 GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, extensionInfo.applicationInfo, appIndex);
6458         }
6459         if ((flags &
6460             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) !=
6461             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_PERMISSION)) {
6462             extensionInfo.permissions.clear();
6463         }
6464         if ((flags &
6465             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) !=
6466             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_METADATA)) {
6467             extensionInfo.metadata.clear();
6468         }
6469         if ((flags &
6470             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) !=
6471             static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_WITH_SKILL)) {
6472             extensionInfo.skills.clear();
6473         }
6474         extensionInfo.appIndex = appIndex;
6475         infos.emplace_back(extensionInfo);
6476     }
6477 }
6478 
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos) const6479 bool BundleDataMgr::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
6480     std::vector<ExtensionAbilityInfo> &extensionInfos) const
6481 {
6482     int32_t requestUserId = GetUserId(userId);
6483     if (requestUserId == Constants::INVALID_USERID) {
6484         LOG_E(BMS_TAG_QUERY, "invalid userId, userId:%{public}d", requestUserId);
6485         return false;
6486     }
6487     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6488     for (const auto &item : bundleInfos_) {
6489         const InnerBundleInfo &innerBundleInfo = item.second;
6490         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
6491         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, 0, responseUserId) != ERR_OK) {
6492             continue;
6493         }
6494         auto innerExtensionInfos = innerBundleInfo.GetInnerExtensionInfos();
6495         for (const auto &info : innerExtensionInfos) {
6496             if (info.second.type == extensionType) {
6497                 ExtensionAbilityInfo extensionAbilityInfo = info.second;
6498                 innerBundleInfo.GetApplicationInfo(
6499                     ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6500                     extensionAbilityInfo.applicationInfo);
6501                 extensionInfos.emplace_back(extensionAbilityInfo);
6502             }
6503         }
6504     }
6505     return true;
6506 }
6507 
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo) const6508 bool BundleDataMgr::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
6509     ExtensionAbilityInfo &extensionAbilityInfo) const
6510 {
6511     int32_t requestUserId = GetUserId(userId);
6512     if (requestUserId == Constants::INVALID_USERID) {
6513         LOG_W(BMS_TAG_QUERY, "invalid userId -1");
6514         return false;
6515     }
6516     if (uri.empty()) {
6517         LOG_W(BMS_TAG_QUERY, "uri empty");
6518         return false;
6519     }
6520     std::string convertUri = uri;
6521     // example of valid param uri : fileShare:///com.example.FileShare/person/10
6522     // example of convertUri : fileShare://com.example.FileShare
6523     size_t schemePos = uri.find(PARAM_URI_SEPARATOR);
6524     if (schemePos != uri.npos) {
6525         // 1. cut string
6526         size_t cutPos = uri.find(ServiceConstants::PATH_SEPARATOR, schemePos + PARAM_URI_SEPARATOR_LEN);
6527         if (cutPos != uri.npos) {
6528             convertUri = uri.substr(0, cutPos);
6529         }
6530         // 2. replace :/// with ://
6531         convertUri.replace(schemePos, PARAM_URI_SEPARATOR_LEN, URI_SEPARATOR);
6532     } else {
6533         if (convertUri.compare(0, DATA_PROXY_URI_PREFIX_LEN, DATA_PROXY_URI_PREFIX) != 0) {
6534             LOG_W(BMS_TAG_QUERY, "invalid uri : %{private}s", uri.c_str());
6535             return false;
6536         }
6537     }
6538     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6539     if (bundleInfos_.empty()) {
6540         LOG_W(BMS_TAG_QUERY, "bundleInfos_ data is empty, uri:%{public}s", uri.c_str());
6541         return false;
6542     }
6543     for (const auto &item : bundleInfos_) {
6544         const InnerBundleInfo &info = item.second;
6545         if (info.IsDisabled()) {
6546             LOG_D(BMS_TAG_QUERY, "app %{public}s is disabled", info.GetBundleName().c_str());
6547             continue;
6548         }
6549 
6550         int32_t responseUserId = info.GetResponseUserId(requestUserId);
6551         if (!info.GetApplicationEnabled(responseUserId)) {
6552             continue;
6553         }
6554 
6555         bool ret = info.FindExtensionAbilityInfoByUri(convertUri, extensionAbilityInfo);
6556         if (!ret) {
6557             continue;
6558         }
6559         info.GetApplicationInfo(
6560             ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, responseUserId,
6561             extensionAbilityInfo.applicationInfo);
6562         return true;
6563     }
6564     LOG_NOFUNC_W(BMS_TAG_QUERY, "QueryExtensionAbilityInfoByUri (%{public}s) failed", convertUri.c_str());
6565     return false;
6566 }
6567 
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)6568 std::string BundleDataMgr::GetStringById(const std::string &bundleName, const std::string &moduleName,
6569     uint32_t resId, int32_t userId, const std::string &localeInfo)
6570 {
6571     APP_LOGD("GetStringById:%{public}s , %{public}s, %{public}d", bundleName.c_str(), moduleName.c_str(), resId);
6572 #ifdef GLOBAL_RESMGR_ENABLE
6573     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6574     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6575         GetResourceManager(bundleName, moduleName, userId);
6576     if (resourceManager == nullptr) {
6577         APP_LOGW("InitResourceManager failed");
6578         return Constants::EMPTY_STRING;
6579     }
6580     std::string label;
6581     OHOS::Global::Resource::RState errValue = resourceManager->GetStringById(resId, label);
6582     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6583         APP_LOGW("GetStringById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6584         return Constants::EMPTY_STRING;
6585     }
6586     return label;
6587 #else
6588     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6589     return Constants::EMPTY_STRING;
6590 #endif
6591 }
6592 
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)6593 std::string BundleDataMgr::GetIconById(
6594     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
6595 {
6596     APP_LOGI("GetIconById bundleName:%{public}s, moduleName:%{public}s, resId:%{public}d, density:%{public}d",
6597         bundleName.c_str(), moduleName.c_str(), resId, density);
6598 #ifdef GLOBAL_RESMGR_ENABLE
6599     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6600     std::shared_ptr<OHOS::Global::Resource::ResourceManager> resourceManager =
6601         GetResourceManager(bundleName, moduleName, userId);
6602     if (resourceManager == nullptr) {
6603         APP_LOGW("InitResourceManager failed");
6604         return Constants::EMPTY_STRING;
6605     }
6606     std::string base64;
6607     OHOS::Global::Resource::RState errValue = resourceManager->GetMediaBase64DataById(resId, base64, density);
6608     if (errValue != OHOS::Global::Resource::RState::SUCCESS) {
6609         APP_LOGW("GetIconById failed, bundleName:%{public}s, id:%{public}d", bundleName.c_str(), resId);
6610         return Constants::EMPTY_STRING;
6611     }
6612     return base64;
6613 #else
6614     APP_LOGW("GLOBAL_RESMGR_ENABLE is false");
6615     return Constants::EMPTY_STRING;
6616 #endif
6617 }
6618 
6619 #ifdef GLOBAL_RESMGR_ENABLE
GetResourceManager(const std::string & bundleName,const std::string & moduleName,int32_t userId,const std::string & localeInfo) const6620 std::shared_ptr<Global::Resource::ResourceManager> BundleDataMgr::GetResourceManager(
6621     const std::string &bundleName, const std::string &moduleName, int32_t userId, const std::string &localeInfo) const
6622 {
6623     InnerBundleInfo innerBundleInfo;
6624     if (!GetInnerBundleInfoWithFlags(bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, userId)) {
6625         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6626         return nullptr;
6627     }
6628     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
6629     BundleInfo bundleInfo;
6630     innerBundleInfo.GetBundleInfo(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfo, responseUserId);
6631     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
6632 
6633     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
6634     if (!resConfig) {
6635         APP_LOGE("resConfig is nullptr");
6636         return nullptr;
6637     }
6638 #ifdef GLOBAL_I18_ENABLE
6639     std::map<std::string, std::string> configs;
6640     OHOS::Global::I18n::LocaleInfo locale(
6641         localeInfo.empty() ? Global::I18n::LocaleConfig::GetEffectiveLanguage() : localeInfo, configs);
6642     resConfig->SetLocaleInfo(locale.GetLanguage().c_str(), locale.GetScript().c_str(), locale.GetRegion().c_str());
6643 #endif
6644     resourceManager->UpdateResConfig(*resConfig);
6645 
6646     for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
6647         std::string moduleResPath;
6648         if (moduleName.empty() || moduleName == hapModuleInfo.moduleName) {
6649             moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
6650         }
6651         if (!moduleResPath.empty()) {
6652             APP_LOGD("DistributedBms::InitResourceManager, moduleResPath: %{public}s", moduleResPath.c_str());
6653             if (!resourceManager->AddResource(moduleResPath.c_str(), Global::Resource::SELECT_STRING
6654             | Global::Resource::SELECT_MEDIA)) {
6655                 APP_LOGW("DistributedBms::InitResourceManager AddResource failed");
6656             }
6657         }
6658     }
6659     return resourceManager;
6660 }
6661 #endif
6662 
GetAllPreInstallBundleInfos()6663 const std::vector<PreInstallBundleInfo> BundleDataMgr::GetAllPreInstallBundleInfos()
6664 {
6665     std::vector<PreInstallBundleInfo> preInstallBundleInfos;
6666     LoadAllPreInstallBundleInfos(preInstallBundleInfos);
6667     return preInstallBundleInfos;
6668 }
6669 
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo) const6670 bool BundleDataMgr::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
6671     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo) const
6672 {
6673     int32_t requestUserId = GetUserId(userId);
6674     if (requestUserId == Constants::INVALID_USERID) {
6675         APP_LOGW("invalid userId: %{public}d", userId);
6676         return false;
6677     }
6678     std::vector<AbilityInfo> abilityInfos;
6679     bool abilityValid =
6680         ImplicitQueryAbilityInfos(want, flags, requestUserId, abilityInfos) && (abilityInfos.size() > 0);
6681     std::vector<ExtensionAbilityInfo> extensionInfos;
6682     bool extensionValid =
6683         ImplicitQueryExtensionInfos(want, flags, requestUserId, extensionInfos) && (extensionInfos.size() > 0);
6684     if (!abilityValid && !extensionValid) {
6685         // both invalid
6686         APP_LOGW("can't find target AbilityInfo or ExtensionAbilityInfo");
6687         return false;
6688     }
6689     if (abilityValid && extensionValid) {
6690         // both valid
6691         if (abilityInfos[0].priority >= extensionInfos[0].priority) {
6692             APP_LOGD("find target AbilityInfo with higher priority, name : %{public}s", abilityInfos[0].name.c_str());
6693             abilityInfo = abilityInfos[0];
6694         } else {
6695             APP_LOGD("find target ExtensionAbilityInfo with higher priority, name : %{public}s",
6696                 extensionInfos[0].name.c_str());
6697             extensionInfo = extensionInfos[0];
6698         }
6699     } else if (abilityValid) {
6700         // only ability valid
6701         APP_LOGD("find target AbilityInfo, name : %{public}s", abilityInfos[0].name.c_str());
6702         abilityInfo = abilityInfos[0];
6703     } else {
6704         // only extension valid
6705         APP_LOGD("find target ExtensionAbilityInfo, name : %{public}s", extensionInfos[0].name.c_str());
6706         extensionInfo = extensionInfos[0];
6707     }
6708     return true;
6709 }
6710 
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos,bool & findDefaultApp)6711 bool BundleDataMgr::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault,
6712     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
6713 {
6714     APP_LOGI_NOFUNC("ImplicitQueryInfos action:%{public}s uri:%{private}s type:%{public}s flags:%{public}d "
6715         "userId:%{public}d withDefault:%{public}d", want.GetAction().c_str(), want.GetUriString().c_str(),
6716         want.GetType().c_str(), flags, userId, withDefault);
6717 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
6718     // step1 : find default infos
6719     if (withDefault && DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos)) {
6720         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6721         if (!abilityInfos.empty() || !extensionInfos.empty()) {
6722             APP_LOGI("find target default application");
6723             findDefaultApp = true;
6724             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6725                 return true;
6726             }
6727             for (auto &info : abilityInfos) {
6728                 info.linkType = LinkType::DEFAULT_APP;
6729             }
6730         }
6731     }
6732     // step2 : find backup default infos
6733     if (withDefault &&
6734         DefaultAppMgr::GetInstance().GetDefaultApplication(want, userId, abilityInfos, extensionInfos, true)) {
6735         FilterAbilityInfosByAppLinking(want, flags, abilityInfos);
6736         if (!abilityInfos.empty() || !extensionInfos.empty()) {
6737             APP_LOGI("find target backup default application");
6738             findDefaultApp = true;
6739             if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
6740                 return true;
6741             }
6742             for (auto &info : abilityInfos) {
6743                 info.linkType = LinkType::DEFAULT_APP;
6744             }
6745         }
6746     }
6747 #endif
6748     // step3 : implicit query infos
6749     bool abilityRet =
6750         ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos) && (abilityInfos.size() > 0);
6751     APP_LOGD("abilityRet: %{public}d, abilityInfos size: %{public}zu", abilityRet, abilityInfos.size());
6752 
6753     bool extensionRet =
6754         ImplicitQueryExtensionInfos(want, flags, userId, extensionInfos) && (extensionInfos.size() > 0);
6755     APP_LOGD("extensionRet: %{public}d, extensionInfos size: %{public}zu", extensionRet, extensionInfos.size());
6756 
6757     ImplicitQueryCloneAbilityInfos(want, flags, userId, abilityInfos);
6758     return abilityRet || extensionRet || abilityInfos.size() > 0;
6759 }
6760 
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)6761 bool BundleDataMgr::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
6762     std::vector<std::string> &dependentModuleNames)
6763 {
6764     APP_LOGD("GetAllDependentModuleNames bundleName: %{public}s, moduleName: %{public}s",
6765         bundleName.c_str(), moduleName.c_str());
6766     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6767     auto item = bundleInfos_.find(bundleName);
6768     if (item == bundleInfos_.end()) {
6769         APP_LOGW("GetAllDependentModuleNames: bundleName:%{public}s not find", bundleName.c_str());
6770         return false;
6771     }
6772     const InnerBundleInfo &innerBundleInfo = item->second;
6773     return innerBundleInfo.GetAllDependentModuleNames(moduleName, dependentModuleNames);
6774 }
6775 
UpdateRemovable(const std::string & bundleName,bool removable)6776 void BundleDataMgr::UpdateRemovable(
6777     const std::string &bundleName, bool removable)
6778 {
6779     APP_LOGD("UpdateRemovable %{public}s", bundleName.c_str());
6780     if (bundleName.empty()) {
6781         APP_LOGW("bundleName is empty");
6782         return;
6783     }
6784 
6785     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6786     auto infoItem = bundleInfos_.find(bundleName);
6787     if (infoItem == bundleInfos_.end()) {
6788         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6789         return;
6790     }
6791 
6792     if (infoItem->second.IsRemovable() != removable) {
6793         infoItem->second.UpdateRemovable(true, removable);
6794         SaveInnerBundleInfo(infoItem->second);
6795     }
6796 }
6797 
UpdatePrivilegeCapability(const std::string & bundleName,const ApplicationInfo & appInfo)6798 void BundleDataMgr::UpdatePrivilegeCapability(
6799     const std::string &bundleName, const ApplicationInfo &appInfo)
6800 {
6801     APP_LOGD("UpdatePrivilegeCapability %{public}s", bundleName.c_str());
6802     if (bundleName.empty()) {
6803         APP_LOGW("bundleName is empty");
6804         return;
6805     }
6806 
6807     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
6808     auto infoItem = bundleInfos_.find(bundleName);
6809     if (infoItem == bundleInfos_.end()) {
6810         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
6811         return;
6812     }
6813 
6814     infoItem->second.UpdatePrivilegeCapability(appInfo);
6815 }
6816 
FetchInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)6817 bool BundleDataMgr::FetchInnerBundleInfo(
6818     const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
6819 {
6820     APP_LOGD("FetchInnerBundleInfo %{public}s", bundleName.c_str());
6821     if (bundleName.empty()) {
6822         APP_LOGW("bundleName is empty");
6823         return false;
6824     }
6825 
6826     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6827     auto infoItem = bundleInfos_.find(bundleName);
6828     if (infoItem == bundleInfos_.end()) {
6829         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
6830         return false;
6831     }
6832 
6833     innerBundleInfo = infoItem->second;
6834     return true;
6835 }
6836 
GetInnerBundleInfoUsers(const std::string & bundleName,std::set<int32_t> & userIds)6837 bool BundleDataMgr::GetInnerBundleInfoUsers(const std::string &bundleName, std::set<int32_t> &userIds)
6838 {
6839     InnerBundleInfo info;
6840     if (!FetchInnerBundleInfo(bundleName, info)) {
6841         APP_LOGW("FetchInnerBundleInfo failed");
6842         return false;
6843     }
6844     std::map<std::string, InnerBundleUserInfo> userInfos = info.GetInnerBundleUserInfos();
6845     for (const auto &userInfo : userInfos) {
6846         userIds.insert(userInfo.second.bundleUserInfo.userId);
6847     }
6848     return true;
6849 }
6850 
IsSystemHsp(const std::string & bundleName)6851 bool BundleDataMgr::IsSystemHsp(const std::string &bundleName)
6852 {
6853     InnerBundleInfo info;
6854     if (!FetchInnerBundleInfo(bundleName, info)) {
6855         APP_LOGW("FetchInnerBundleInfo %{public}s failed", bundleName.c_str());
6856         return false;
6857     }
6858     return info.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK;
6859 }
6860 
6861 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
QueryInfoAndSkillsByElement(int32_t userId,const Element & element,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo,std::vector<Skill> & skills) const6862 bool BundleDataMgr::QueryInfoAndSkillsByElement(int32_t userId, const Element& element,
6863     AbilityInfo& abilityInfo, ExtensionAbilityInfo& extensionInfo, std::vector<Skill>& skills) const
6864 {
6865     APP_LOGD("begin to QueryInfoAndSkillsByElement");
6866     const std::string& bundleName = element.bundleName;
6867     const std::string& moduleName = element.moduleName;
6868     const std::string& abilityName = element.abilityName;
6869     const std::string& extensionName = element.extensionName;
6870     Want want;
6871     ElementName elementName("", bundleName, abilityName, moduleName);
6872     want.SetElement(elementName);
6873     bool isAbility = !element.abilityName.empty();
6874     bool ret = false;
6875     if (isAbility) {
6876         // get ability info
6877         ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6878         if (!ret) {
6879             APP_LOGD("ExplicitQueryAbilityInfo failed, abilityName:%{public}s", element.abilityName.c_str());
6880             return false;
6881         }
6882     } else {
6883         // get extension info
6884         elementName.SetAbilityName(extensionName);
6885         want.SetElement(elementName);
6886         ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6887         if (!ret) {
6888             APP_LOGD("ExplicitQueryExtensionInfo failed, extensionName:%{public}s", extensionName.c_str());
6889             return false;
6890         }
6891     }
6892 
6893     // get skills info
6894     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6895     if (bundleInfos_.empty()) {
6896         APP_LOGW("bundleInfos_ is empty");
6897         return false;
6898     }
6899     auto item = bundleInfos_.find(bundleName);
6900     if (item == bundleInfos_.end()) {
6901         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
6902         return false;
6903     }
6904     const InnerBundleInfo& innerBundleInfo = item->second;
6905     if (isAbility) {
6906         std::string key;
6907         key.append(bundleName).append(".").append(abilityInfo.package).append(".").append(abilityName);
6908         APP_LOGD("begin to find ability skills, key : %{public}s", key.c_str());
6909         for (const auto& infoItem : innerBundleInfo.GetInnerSkillInfos()) {
6910             if (infoItem.first == key) {
6911                 skills = infoItem.second;
6912                 APP_LOGD("find ability skills success");
6913                 break;
6914             }
6915         }
6916     } else {
6917         std::string key;
6918         key.append(bundleName).append(".").append(moduleName).append(".").append(extensionName);
6919         APP_LOGD("begin to find extension skills, key : %{public}s", key.c_str());
6920         for (const auto& infoItem : innerBundleInfo.GetExtensionSkillInfos()) {
6921             if (infoItem.first == key) {
6922                 skills = infoItem.second;
6923                 APP_LOGD("find extension skills success");
6924                 break;
6925             }
6926         }
6927     }
6928     APP_LOGD("QueryInfoAndSkillsByElement success");
6929     return true;
6930 }
6931 
GetElement(int32_t userId,const ElementName & elementName,Element & element) const6932 bool BundleDataMgr::GetElement(int32_t userId, const ElementName& elementName, Element& element) const
6933 {
6934     APP_LOGD("begin to GetElement");
6935     const std::string& bundleName = elementName.GetBundleName();
6936     const std::string& moduleName = elementName.GetModuleName();
6937     const std::string& abilityName = elementName.GetAbilityName();
6938     if (bundleName.empty() || moduleName.empty() || abilityName.empty()) {
6939         APP_LOGW("bundleName or moduleName or abilityName is empty");
6940         return false;
6941     }
6942     Want want;
6943     want.SetElement(elementName);
6944     AbilityInfo abilityInfo;
6945     bool ret = ExplicitQueryAbilityInfo(want, GET_ABILITY_INFO_DEFAULT, userId, abilityInfo);
6946     if (ret) {
6947         APP_LOGD("ElementName is ability");
6948         element.bundleName = bundleName;
6949         element.moduleName = moduleName;
6950         element.abilityName = abilityName;
6951         return true;
6952     }
6953 
6954     ExtensionAbilityInfo extensionInfo;
6955     ret = ExplicitQueryExtensionInfo(want, GET_EXTENSION_INFO_DEFAULT, userId, extensionInfo);
6956     if (ret) {
6957         APP_LOGD("ElementName is extension");
6958         element.bundleName = bundleName;
6959         element.moduleName = moduleName;
6960         element.extensionName = abilityName;
6961         return true;
6962     }
6963 
6964     if (DelayedSingleton<BundleMgrService>::GetInstance()->IsBrokerServiceStarted()) {
6965         APP_LOGI("query ability from broker");
6966         AbilityInfo brokerAbilityInfo;
6967         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
6968         ErrCode resultCode = bmsExtensionClient->QueryAbilityInfo(want, 0, userId, brokerAbilityInfo, true);
6969         if (resultCode == ERR_OK) {
6970             APP_LOGI("ElementName is brokerAbility");
6971             element.bundleName = bundleName;
6972             element.moduleName = moduleName;
6973             element.abilityName = abilityName;
6974             return true;
6975         }
6976     }
6977 
6978     APP_LOGW("ElementName doesn't exist");
6979     return false;
6980 }
6981 #endif
6982 
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) const6983 ErrCode BundleDataMgr::GetMediaData(const std::string &bundleName, const std::string &moduleName,
6984     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId) const
6985 {
6986     APP_LOGI("begin");
6987 #ifdef GLOBAL_RESMGR_ENABLE
6988     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
6989     int32_t requestUserId = GetUserId(userId);
6990     if (requestUserId == Constants::INVALID_USERID) {
6991         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
6992     }
6993     InnerBundleInfo innerBundleInfo;
6994     ErrCode errCode = GetInnerBundleInfoWithFlagsV9(
6995         bundleName, BundleFlag::GET_BUNDLE_DEFAULT, innerBundleInfo, requestUserId);
6996     if (errCode != ERR_OK) {
6997         return errCode;
6998     }
6999     AbilityInfo abilityInfo;
7000     errCode = FindAbilityInfoInBundleInfo(innerBundleInfo, moduleName, abilityName, abilityInfo);
7001     if (errCode != ERR_OK) {
7002         return errCode;
7003     }
7004     bool isEnable = false;
7005     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
7006     errCode = innerBundleInfo.IsAbilityEnabledV9(abilityInfo, responseUserId, isEnable);
7007     if (errCode != ERR_OK) {
7008         return errCode;
7009     }
7010     if (!isEnable) {
7011         APP_LOGE("%{public}s ability disabled: %{public}s", bundleName.c_str(), abilityName.c_str());
7012         return ERR_BUNDLE_MANAGER_ABILITY_DISABLED;
7013     }
7014     std::shared_ptr<Global::Resource::ResourceManager> resourceManager =
7015         GetResourceManager(bundleName, abilityInfo.moduleName, responseUserId);
7016     if (resourceManager == nullptr) {
7017         APP_LOGE("InitResourceManager failed, bundleName:%{public}s", bundleName.c_str());
7018         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7019     }
7020     OHOS::Global::Resource::RState ret =
7021         resourceManager->GetMediaDataById(static_cast<uint32_t>(abilityInfo.iconId), len, mediaDataPtr);
7022     if (ret != OHOS::Global::Resource::RState::SUCCESS || mediaDataPtr == nullptr || len == 0) {
7023         APP_LOGE("GetMediaDataById failed, bundleName:%{public}s", bundleName.c_str());
7024         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7025     }
7026     return ERR_OK;
7027 #else
7028     return ERR_BUNDLE_MANAGER_GLOBAL_RES_MGR_ENABLE_DISABLED;
7029 #endif
7030 }
7031 
GetStatusCallbackMutex()7032 std::shared_mutex &BundleDataMgr::GetStatusCallbackMutex()
7033 {
7034     return callbackMutex_;
7035 }
7036 
GetCallBackList() const7037 std::vector<sptr<IBundleStatusCallback>> BundleDataMgr::GetCallBackList() const
7038 {
7039     return callbackList_;
7040 }
7041 
UpdateQuickFixInnerBundleInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)7042 bool BundleDataMgr::UpdateQuickFixInnerBundleInfo(const std::string &bundleName,
7043     const InnerBundleInfo &innerBundleInfo)
7044 {
7045     APP_LOGD("to update info:%{public}s", bundleName.c_str());
7046     if (bundleName.empty()) {
7047         APP_LOGW("update info fail, empty bundle name");
7048         return false;
7049     }
7050 
7051     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7052     auto infoItem = bundleInfos_.find(bundleName);
7053     if (infoItem == bundleInfos_.end()) {
7054         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7055         return false;
7056     }
7057 
7058     if (dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7059         bundleInfos_.at(bundleName) = innerBundleInfo;
7060         return true;
7061     }
7062     APP_LOGE("to update info:%{public}s failed", bundleName.c_str());
7063     return false;
7064 }
7065 
UpdateInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,bool needSaveStorage)7066 bool BundleDataMgr::UpdateInnerBundleInfo(const InnerBundleInfo &innerBundleInfo, bool needSaveStorage)
7067 {
7068     std::string bundleName = innerBundleInfo.GetBundleName();
7069     if (bundleName.empty()) {
7070         APP_LOGW("UpdateInnerBundleInfo failed, empty bundle name");
7071         return false;
7072     }
7073     APP_LOGD("UpdateInnerBundleInfo:%{public}s", bundleName.c_str());
7074     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7075     auto infoItem = bundleInfos_.find(bundleName);
7076     if (infoItem == bundleInfos_.end()) {
7077         APP_LOGW("bundle:%{public}s info is not existed", bundleName.c_str());
7078         return false;
7079     }
7080 
7081     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7082         APP_LOGE("to update InnerBundleInfo:%{public}s failed", bundleName.c_str());
7083         return false;
7084     }
7085     bundleInfos_.at(bundleName) = innerBundleInfo;
7086     return true;
7087 }
7088 
QueryOverlayInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info)7089 bool BundleDataMgr::QueryOverlayInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info)
7090 {
7091     APP_LOGD("start to query overlay innerBundleInfo");
7092     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7093     if (bundleInfos_.find(bundleName) != bundleInfos_.end()) {
7094         info = bundleInfos_.at(bundleName);
7095         return true;
7096     }
7097 
7098     APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7099     return false;
7100 }
7101 
SaveOverlayInfo(const std::string & bundleName,InnerBundleInfo & innerBundleInfo)7102 void BundleDataMgr::SaveOverlayInfo(const std::string &bundleName, InnerBundleInfo &innerBundleInfo)
7103 {
7104     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7105     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
7106     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
7107         APP_LOGE("update storage failed bundle:%{public}s", bundleName.c_str());
7108         return;
7109     }
7110     bundleInfos_.at(bundleName) = innerBundleInfo;
7111 }
7112 
GetAppProvisionInfo(const std::string & bundleName,int32_t userId,AppProvisionInfo & appProvisionInfo)7113 ErrCode BundleDataMgr::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
7114     AppProvisionInfo &appProvisionInfo)
7115 {
7116     if (!HasUserId(userId)) {
7117         APP_LOGW("GetAppProvisionInfo user is not existed. bundleName:%{public}s", bundleName.c_str());
7118         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7119     }
7120     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7121     auto infoItem = bundleInfos_.find(bundleName);
7122     if (infoItem == bundleInfos_.end()) {
7123         APP_LOGW_NOFUNC("-n %{public}s not exist", bundleName.c_str());
7124         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7125     }
7126     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7127         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7128         if (responseUserId == Constants::INVALID_USERID) {
7129             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7130         }
7131     }
7132     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAppProvisionInfo(bundleName, appProvisionInfo)) {
7133         APP_LOGW("bundleName:%{public}s GetAppProvisionInfo failed", bundleName.c_str());
7134         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7135     }
7136     return ERR_OK;
7137 }
7138 
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas) const7139 ErrCode BundleDataMgr::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
7140     std::vector<Metadata> &provisionMetadatas) const
7141 {
7142     // Reserved interface
7143     return ERR_OK;
7144 }
7145 
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> & sharedBundles) const7146 ErrCode BundleDataMgr::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles) const
7147 {
7148     APP_LOGD("GetAllSharedBundleInfo");
7149     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7150 
7151     for (const auto& [key, innerBundleInfo] : bundleInfos_) {
7152         if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7153             continue;
7154         }
7155         SharedBundleInfo sharedBundleInfo;
7156         innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7157         sharedBundles.emplace_back(sharedBundleInfo);
7158     }
7159 
7160     return ERR_OK;
7161 }
7162 
GetSharedBundleInfo(const std::string & bundleName,const std::string & moduleName,std::vector<SharedBundleInfo> & sharedBundles)7163 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
7164     std::vector<SharedBundleInfo> &sharedBundles)
7165 {
7166     APP_LOGD("GetSharedBundleInfo");
7167     if (bundleName.empty() || moduleName.empty()) {
7168         APP_LOGW("bundleName or moduleName is empty");
7169         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7170     }
7171 
7172     std::vector<Dependency> dependencies;
7173     ErrCode errCode = GetSharedDependencies(bundleName, moduleName, dependencies);
7174     if (errCode != ERR_OK) {
7175         APP_LOGD("GetSharedDependencies failed errCode is %{public}d, bundleName:%{public}s",
7176             errCode, bundleName.c_str());
7177         return errCode;
7178     }
7179 
7180     for (const auto& dep : dependencies) {
7181         SharedBundleInfo sharedBundleInfo;
7182         errCode = GetSharedBundleInfoBySelf(dep.bundleName, sharedBundleInfo);
7183         if (errCode != ERR_OK) {
7184             APP_LOGD("GetSharedBundleInfoBySelf failed errCode is %{public}d, bundleName:%{public}s",
7185                 errCode, bundleName.c_str());
7186             return errCode;
7187         }
7188         sharedBundles.emplace_back(sharedBundleInfo);
7189     }
7190 
7191     return ERR_OK;
7192 }
7193 
GetSharedBundleInfoBySelf(const std::string & bundleName,SharedBundleInfo & sharedBundleInfo)7194 ErrCode BundleDataMgr::GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)
7195 {
7196     APP_LOGD("GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
7197     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7198     auto infoItem = bundleInfos_.find(bundleName);
7199     if (infoItem == bundleInfos_.end()) {
7200         APP_LOGW("GetSharedBundleInfoBySelf failed, can not find bundle %{public}s",
7201             bundleName.c_str());
7202         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7203     }
7204     const InnerBundleInfo &innerBundleInfo = infoItem->second;
7205     if (innerBundleInfo.GetApplicationBundleType() != BundleType::SHARED) {
7206         APP_LOGW("GetSharedBundleInfoBySelf failed, the bundle(%{public}s) is not shared library",
7207             bundleName.c_str());
7208         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7209     }
7210     innerBundleInfo.GetSharedBundleInfo(sharedBundleInfo);
7211     APP_LOGD("GetSharedBundleInfoBySelf(%{public}s) successfully)", bundleName.c_str());
7212     return ERR_OK;
7213 }
7214 
GetSharedDependencies(const std::string & bundleName,const std::string & moduleName,std::vector<Dependency> & dependencies)7215 ErrCode BundleDataMgr::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
7216     std::vector<Dependency> &dependencies)
7217 {
7218     APP_LOGD("GetSharedDependencies bundleName: %{public}s, moduleName: %{public}s",
7219         bundleName.c_str(), moduleName.c_str());
7220     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7221     auto item = bundleInfos_.find(bundleName);
7222     if (item == bundleInfos_.end()) {
7223         APP_LOGW("GetSharedDependencies failed, can not find bundle %{public}s", bundleName.c_str());
7224         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7225     }
7226     const InnerBundleInfo &innerBundleInfo = item->second;
7227     if (!innerBundleInfo.GetAllSharedDependencies(moduleName, dependencies)) {
7228         APP_LOGW("GetSharedDependencies failed, can not find module %{public}s", moduleName.c_str());
7229         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7230     }
7231     APP_LOGD("GetSharedDependencies(bundle %{public}s, module %{public}s) successfully)",
7232         bundleName.c_str(), moduleName.c_str());
7233     return ERR_OK;
7234 }
7235 
CheckHspVersionIsRelied(int32_t versionCode,const InnerBundleInfo & info) const7236 bool BundleDataMgr::CheckHspVersionIsRelied(int32_t versionCode, const InnerBundleInfo &info) const
7237 {
7238     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7239     std::string hspBundleName = info.GetBundleName();
7240     if (versionCode == Constants::ALL_VERSIONCODE) {
7241         // uninstall hsp bundle, check other bundle denpendency
7242         return CheckHspBundleIsRelied(hspBundleName);
7243     }
7244     std::vector<std::string> hspModules = info.GetAllHspModuleNamesForVersion(static_cast<uint32_t>(versionCode));
7245     // check whether has higher version
7246     std::vector<uint32_t> versionCodes = info.GetAllHspVersion();
7247     for (const auto &item : versionCodes) {
7248         if (item > static_cast<uint32_t>(versionCode)) {
7249             return false;
7250         }
7251     }
7252     // check other bundle denpendency
7253     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7254         if (bundleName == hspBundleName) {
7255             continue;
7256         }
7257         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7258         for (const auto &dependencyItem : dependencyList) {
7259             if (dependencyItem.bundleName == hspBundleName &&
7260                 std::find(hspModules.begin(), hspModules.end(), dependencyItem.moduleName) != hspModules.end()) {
7261                 return true;
7262             }
7263         }
7264     }
7265     return false;
7266 }
7267 
CheckHspBundleIsRelied(const std::string & hspBundleName) const7268 bool BundleDataMgr::CheckHspBundleIsRelied(const std::string &hspBundleName) const
7269 {
7270     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7271         if (bundleName == hspBundleName) {
7272             continue;
7273         }
7274         std::vector<Dependency> dependencyList = innerBundleInfo.GetDependencies();
7275         for (const auto &dependencyItem : dependencyList) {
7276             if (dependencyItem.bundleName == hspBundleName) {
7277                 return true;
7278             }
7279         }
7280     }
7281     return false;
7282 }
7283 
GetSharedBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo)7284 ErrCode BundleDataMgr::GetSharedBundleInfo(const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo)
7285 {
7286     if (bundleName.empty()) {
7287         APP_LOGW("bundleName is empty");
7288         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
7289     }
7290 
7291     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7292     auto infoItem = bundleInfos_.find(bundleName);
7293     if (infoItem == bundleInfos_.end()) {
7294         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
7295         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7296     }
7297     const InnerBundleInfo &innerBundleInfo = infoItem->second;
7298     innerBundleInfo.GetSharedBundleInfo(flags, bundleInfo);
7299     return ERR_OK;
7300 }
7301 
IsPreInstallApp(const std::string & bundleName)7302 bool BundleDataMgr::IsPreInstallApp(const std::string &bundleName)
7303 {
7304     APP_LOGD("IsPreInstallApp bundleName: %{public}s", bundleName.c_str());
7305     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7306     auto item = bundleInfos_.find(bundleName);
7307     if (item == bundleInfos_.end()) {
7308         APP_LOGW("IsPreInstallApp failed, can not find bundle %{public}s",
7309             bundleName.c_str());
7310         return false;
7311     }
7312     return item->second.IsPreInstallApp();
7313 }
7314 
GetProxyDataInfos(const std::string & bundleName,const std::string & moduleName,int32_t userId,std::vector<ProxyData> & proxyDatas) const7315 ErrCode BundleDataMgr::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
7316     int32_t userId, std::vector<ProxyData> &proxyDatas) const
7317 {
7318     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7319     InnerBundleInfo info;
7320     auto ret = GetInnerBundleInfoWithBundleFlagsV9(
7321         bundleName, static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), info, userId);
7322     if (ret != ERR_OK) {
7323         APP_LOGD("GetProxyData failed for GetInnerBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7324         return ret;
7325     }
7326     return info.GetProxyDataInfos(moduleName, proxyDatas);
7327 }
7328 
GetAllProxyDataInfos(int32_t userId,std::vector<ProxyData> & proxyDatas) const7329 ErrCode BundleDataMgr::GetAllProxyDataInfos(int32_t userId, std::vector<ProxyData> &proxyDatas) const
7330 {
7331     std::vector<BundleInfo> bundleInfos;
7332     auto ret = GetBundleInfosV9(
7333         static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfos, userId);
7334     if (ret != ERR_OK) {
7335         APP_LOGD("GetAllProxyDataInfos failed for GetBundleInfos failed");
7336         return ret;
7337     }
7338     for (const auto &bundleInfo : bundleInfos) {
7339         for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
7340             proxyDatas.insert(
7341                 proxyDatas.end(), hapModuleInfo.proxyDatas.begin(), hapModuleInfo.proxyDatas.end());
7342         }
7343     }
7344     return ERR_OK;
7345 }
7346 
GetBundleNameByAppId(const std::string & appId) const7347 std::string BundleDataMgr::GetBundleNameByAppId(const std::string &appId) const
7348 {
7349     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7350     auto it = std::find_if(bundleInfos_.cbegin(), bundleInfos_.cend(), [&appId](const auto &pair) {
7351         return appId == pair.second.GetAppId();
7352     });
7353     if (it == bundleInfos_.cend()) {
7354         APP_LOGW("invalid appId, can't find bundleName");
7355         return Constants::EMPTY_STRING;
7356     }
7357     return it->second.GetBundleName();
7358 }
7359 
SetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,AOTCompileStatus aotCompileStatus,uint32_t versionCode)7360 void BundleDataMgr::SetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7361     AOTCompileStatus aotCompileStatus, uint32_t versionCode)
7362 {
7363     APP_LOGD("SetAOTCompileStatus, bundleName : %{public}s, moduleName : %{public}s, aotCompileStatus : %{public}d",
7364         bundleName.c_str(), moduleName.c_str(), aotCompileStatus);
7365     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7366     auto item = bundleInfos_.find(bundleName);
7367     if (item == bundleInfos_.end()) {
7368         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7369         (void)InstalldClient::GetInstance()->RemoveDir(ServiceConstants::ARK_CACHE_PATH + bundleName);
7370         return;
7371     }
7372     if (item->second.GetVersionCode() != versionCode) {
7373         APP_LOGW("versionCode inconsistent, param : %{public}u, current : %{public}u, bundleName:%{public}s",
7374             versionCode, item->second.GetVersionCode(), bundleName.c_str());
7375         return;
7376     }
7377     item->second.SetAOTCompileStatus(moduleName, aotCompileStatus);
7378     std::string abi;
7379     std::string path;
7380     if (aotCompileStatus == AOTCompileStatus::COMPILE_SUCCESS) {
7381         abi = ServiceConstants::ARM64_V8A;
7382         path = std::string(ServiceConstants::ARM64) + ServiceConstants::PATH_SEPARATOR;
7383     }
7384     item->second.SetArkNativeFileAbi(abi);
7385     item->second.SetArkNativeFilePath(path);
7386     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7387         APP_LOGW("SaveStorageBundleInfo failed bundleName:%{public}s", bundleName.c_str());
7388     }
7389 }
7390 
ResetAOTFlags()7391 void BundleDataMgr::ResetAOTFlags()
7392 {
7393     APP_LOGI("ResetAOTFlags begin");
7394     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7395     std::for_each(bundleInfos_.begin(), bundleInfos_.end(), [this](auto &item) {
7396         item.second.ResetAOTFlags();
7397         if (!dataStorage_->SaveStorageBundleInfo(item.second)) {
7398             APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item.second.GetBundleName().c_str());
7399         }
7400     });
7401     APP_LOGI("ResetAOTFlags end");
7402 }
7403 
ResetAOTFlagsCommand(const std::string & bundleName)7404 void BundleDataMgr::ResetAOTFlagsCommand(const std::string &bundleName)
7405 {
7406     APP_LOGI("ResetAOTFlagsCommand begin");
7407     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7408     auto item = bundleInfos_.find(bundleName);
7409     if (item == bundleInfos_.end()) {
7410         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7411         return;
7412     }
7413     item->second.ResetAOTFlags();
7414     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7415         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7416         return;
7417     }
7418     APP_LOGI("ResetAOTFlagsCommand end");
7419 }
7420 
ResetAOTCompileStatus(const std::string & bundleName,const std::string & moduleName,int32_t triggerMode)7421 ErrCode BundleDataMgr::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
7422     int32_t triggerMode)
7423 {
7424     APP_LOGI("ResetAOTCompileStatus begin");
7425     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7426     auto item = bundleInfos_.find(bundleName);
7427     if (item == bundleInfos_.end()) {
7428         APP_LOGE("bundleName %{public}s not exist", bundleName.c_str());
7429         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7430     }
7431     ErrCode ret = item->second.ResetAOTCompileStatus(moduleName);
7432     if (ret != ERR_OK) {
7433         return ret;
7434     }
7435     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7436         APP_LOGW("SaveStorageBundleInfo failed, bundleName : %{public}s", item->second.GetBundleName().c_str());
7437         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7438     }
7439     APP_LOGI("ResetAOTCompileStatus end");
7440     return ERR_OK;
7441 }
7442 
GetAllBundleName() const7443 std::vector<std::string> BundleDataMgr::GetAllBundleName() const
7444 {
7445     APP_LOGD("GetAllBundleName begin");
7446     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7447     std::vector<std::string> bundleNames;
7448     bundleNames.reserve(bundleInfos_.size());
7449     std::transform(bundleInfos_.cbegin(), bundleInfos_.cend(), std::back_inserter(bundleNames), [](const auto &item) {
7450         return item.first;
7451     });
7452     return bundleNames;
7453 }
7454 
GetAllLiteBundleInfo(const int32_t userId) const7455 std::vector<std::tuple<std::string, int32_t, int32_t>> BundleDataMgr::GetAllLiteBundleInfo(const int32_t userId) const
7456 {
7457     std::set<int32_t> userIds = GetAllUser();
7458     if (userIds.find(userId) == userIds.end()) {
7459         APP_LOGW("invalid userId");
7460         return {};
7461     }
7462     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7463     std::vector<std::tuple<std::string, int32_t, int32_t>> bundles;
7464     for (const auto &[bundleName, innerBundleInfo] : bundleInfos_) {
7465         auto installedUsers = innerBundleInfo.GetUsers();
7466         if (installedUsers.find(userId) == installedUsers.end()) {
7467             continue;
7468         }
7469         bundles.emplace_back(bundleName, innerBundleInfo.GetUid(userId), innerBundleInfo.GetGid(userId));
7470     }
7471     return bundles;
7472 }
7473 
GetBundleNamesForNewUser() const7474 std::vector<std::string> BundleDataMgr::GetBundleNamesForNewUser() const
7475 {
7476     APP_LOGD("begin");
7477     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7478     std::vector<std::string> bundleNames;
7479     for (const auto &item : bundleInfos_) {
7480         if (item.second.GetApplicationBundleType() == BundleType::SHARED ||
7481             item.second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
7482             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
7483                 item.second.GetBundleName().c_str());
7484             continue;
7485         }
7486         // this function is used to install additional bundle in new user, so ignore pre-install app
7487         if (item.second.IsPreInstallApp()) {
7488             APP_LOGD("app %{public}s is pre-install app, ignore", item.second.GetBundleName().c_str());
7489             continue;
7490         }
7491         if (item.second.IsInstalledForAllUser() &&
7492             OHOS::system::GetBoolParameter(ServiceConstants::IS_ENTERPRISE_DEVICE, false)) {
7493             APP_LOGI("%{public}s is installed for all user", item.second.GetBundleName().c_str());
7494             bundleNames.emplace_back(item.second.GetBundleName());
7495             continue;
7496         }
7497         const auto extensions = item.second.GetInnerExtensionInfos();
7498         for (const auto &extensionItem : extensions) {
7499             if (extensionItem.second.type == ExtensionAbilityType::DRIVER) {
7500                 bundleNames.emplace_back(extensionItem.second.bundleName);
7501                 APP_LOGI("driver bundle found: %{public}s", extensionItem.second.bundleName.c_str());
7502                 break;
7503             }
7504         }
7505     }
7506     return bundleNames;
7507 }
7508 
QueryInnerBundleInfo(const std::string & bundleName,InnerBundleInfo & info) const7509 bool BundleDataMgr::QueryInnerBundleInfo(const std::string &bundleName, InnerBundleInfo &info) const
7510 {
7511     APP_LOGD("QueryInnerBundleInfo begin, bundleName : %{public}s", bundleName.c_str());
7512     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7513     auto item = bundleInfos_.find(bundleName);
7514     if (item == bundleInfos_.end()) {
7515         APP_LOGW_NOFUNC("QueryInnerBundleInfo not find %{public}s", bundleName.c_str());
7516         return false;
7517     }
7518     info = item->second;
7519     return true;
7520 }
7521 
GetUserIds(const std::string & bundleName) const7522 std::vector<int32_t> BundleDataMgr::GetUserIds(const std::string &bundleName) const
7523 {
7524     APP_LOGD("GetUserIds begin, bundleName : %{public}s", bundleName.c_str());
7525     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7526     std::vector<int32_t> userIds;
7527     auto infoItem = bundleInfos_.find(bundleName);
7528     if (infoItem == bundleInfos_.end()) {
7529         APP_LOGW("can't find bundleName : %{public}s", bundleName.c_str());
7530         return userIds;
7531     }
7532     auto userInfos = infoItem->second.GetInnerBundleUserInfos();
7533     std::transform(userInfos.cbegin(), userInfos.cend(), std::back_inserter(userIds), [](const auto &item) {
7534         return item.second.bundleUserInfo.userId;
7535     });
7536     return userIds;
7537 }
7538 
CreateAppEl5GroupDir(const std::string & bundleName,int32_t userId)7539 void BundleDataMgr::CreateAppEl5GroupDir(const std::string &bundleName, int32_t userId)
7540 {
7541     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7542     auto bundleInfoItem = bundleInfos_.find(bundleName);
7543     if (bundleInfoItem == bundleInfos_.end()) {
7544         APP_LOGW("%{public}s not found", bundleName.c_str());
7545         return;
7546     }
7547     bool needCreateEl5Dir = bundleInfoItem->second.NeedCreateEl5Dir();
7548     if (!needCreateEl5Dir) {
7549         return;
7550     }
7551     auto dataGroupInfoMap = bundleInfoItem->second.GetDataGroupInfos();
7552     if (dataGroupInfoMap.empty()) {
7553         return;
7554     }
7555     std::vector<DataGroupInfo> dataGroupInfos;
7556     for (const auto &groupItem : dataGroupInfoMap) {
7557         for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7558             if (dataGroupInfo.userId == userId) {
7559                 dataGroupInfos.emplace_back(dataGroupInfo);
7560             }
7561         }
7562     }
7563     if (CreateEl5GroupDirs(dataGroupInfos, userId) != ERR_OK) {
7564         APP_LOGW("create el5 group dirs for %{public}s %{public}d failed", bundleName.c_str(), userId);
7565     }
7566 }
7567 
CreateAppGroupDir(const InnerBundleInfo & info,int32_t userId)7568 bool BundleDataMgr::CreateAppGroupDir(const InnerBundleInfo &info, int32_t userId)
7569 {
7570     auto dataGroupInfoMap = info.GetDataGroupInfos();
7571     if (dataGroupInfoMap.empty()) {
7572         return true;
7573     }
7574     std::vector<DataGroupInfo> dataGroupInfos;
7575     for (const auto &groupItem : dataGroupInfoMap) {
7576         for (const DataGroupInfo &dataGroupInfo : groupItem.second) {
7577             if (dataGroupInfo.userId == userId) {
7578                 dataGroupInfos.emplace_back(dataGroupInfo);
7579             }
7580         }
7581     }
7582     bool needCreateEl5Dir = info.NeedCreateEl5Dir();
7583     return CreateGroupDirs(dataGroupInfos, userId, needCreateEl5Dir) == ERR_OK;
7584 }
7585 
CreateAppGroupDir(const std::string & bundleName,int32_t userId)7586 bool BundleDataMgr::CreateAppGroupDir(const std::string &bundleName, int32_t userId)
7587 {
7588     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7589     auto bundleInfoItem = bundleInfos_.find(bundleName);
7590     if (bundleInfoItem == bundleInfos_.end()) {
7591         APP_LOGW("%{public}s not found", bundleName.c_str());
7592         return false;
7593     }
7594     return CreateAppGroupDir(bundleInfoItem->second, userId);
7595 }
7596 
CreateGroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId,bool needCreateEl5Dir)7597 ErrCode BundleDataMgr::CreateGroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId,
7598     bool needCreateEl5Dir)
7599 {
7600     if (dataGroupInfos.empty()) {
7601         return ERR_OK;
7602     }
7603     std::vector<CreateDirParam> params;
7604     for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
7605         CreateDirParam param;
7606         param.uuid = dataGroupInfo.uuid;
7607         param.uid = dataGroupInfo.uid;
7608         param.gid = dataGroupInfo.gid;
7609         param.userId = dataGroupInfo.userId;
7610         params.emplace_back(param);
7611     }
7612     ErrCode res = ERR_OK;
7613     auto nonEl5Res = InstalldClient::GetInstance()->CreateDataGroupDirs(params);
7614     if (nonEl5Res != ERR_OK) {
7615         APP_LOGE("mkdir group dir failed %{public}d", nonEl5Res);
7616         res = nonEl5Res;
7617     }
7618     if (!needCreateEl5Dir) {
7619         return res;
7620     }
7621     auto el5Res = CreateEl5GroupDirs(dataGroupInfos, userId);
7622     if (el5Res != ERR_OK) {
7623         APP_LOGE("el5Res %{public}d", el5Res);
7624         res = el5Res;
7625     }
7626     return res;
7627 }
7628 
CreateEl5GroupDirs(const std::vector<DataGroupInfo> & dataGroupInfos,int32_t userId)7629 ErrCode BundleDataMgr::CreateEl5GroupDirs(const std::vector<DataGroupInfo> &dataGroupInfos, int32_t userId)
7630 {
7631     if (dataGroupInfos.empty()) {
7632         return ERR_OK;
7633     }
7634     std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
7635         ServiceConstants::PATH_SEPARATOR + std::to_string(userId);
7636     if (!BundleUtil::IsExistDir(parentDir)) {
7637         APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
7638         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7639     }
7640     ErrCode res = ERR_OK;
7641     for (const DataGroupInfo &dataGroupInfo : dataGroupInfos) {
7642         // create el5 group dirs
7643         std::string dir = parentDir + ServiceConstants::DATA_GROUP_PATH + dataGroupInfo.uuid;
7644         auto result = InstalldClient::GetInstance()->Mkdir(dir,
7645             ServiceConstants::DATA_GROUP_DIR_MODE, dataGroupInfo.uid, dataGroupInfo.gid);
7646         if (result != ERR_OK) {
7647             APP_LOGW("id %{public}s group dir %{private}s userId %{public}d failed",
7648                 dataGroupInfo.dataGroupId.c_str(), dataGroupInfo.uuid.c_str(), userId);
7649             res = result;
7650         }
7651         // set el5 group dirs encryption policy
7652         EncryptionParam encryptionParam("", dataGroupInfo.uuid, dataGroupInfo.uid, userId, EncryptionDirType::GROUP);
7653         std::string keyId = "";
7654         auto setPolicyRes = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
7655         if (setPolicyRes != ERR_OK) {
7656             LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
7657             res = setPolicyRes;
7658         }
7659     }
7660     return res;
7661 }
7662 
GetSpecifiedDistributionType(const std::string & bundleName,std::string & specifiedDistributionType)7663 ErrCode BundleDataMgr::GetSpecifiedDistributionType(
7664     const std::string &bundleName, std::string &specifiedDistributionType)
7665 {
7666     APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
7667     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7668     auto infoItem = bundleInfos_.find(bundleName);
7669     if (infoItem == bundleInfos_.end()) {
7670         APP_LOGW_NOFUNC("-n %{public}s does not exist", bundleName.c_str());
7671         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7672     }
7673     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7674         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7675         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7676         if (responseUserId == Constants::INVALID_USERID) {
7677             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7678             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7679         }
7680     }
7681     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetSpecifiedDistributionType(bundleName,
7682         specifiedDistributionType)) {
7683         APP_LOGW("bundleName:%{public}s GetSpecifiedDistributionType failed", bundleName.c_str());
7684         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7685     }
7686     return ERR_OK;
7687 }
7688 
GetAdditionalInfo(const std::string & bundleName,std::string & additionalInfo)7689 ErrCode BundleDataMgr::GetAdditionalInfo(
7690     const std::string &bundleName, std::string &additionalInfo)
7691 {
7692     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
7693     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7694     auto infoItem = bundleInfos_.find(bundleName);
7695     if (infoItem == bundleInfos_.end()) {
7696         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
7697         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7698     }
7699     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
7700         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
7701         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
7702         if (responseUserId == Constants::INVALID_USERID) {
7703             APP_LOGW("bundleName: %{public}s does not exist in current userId", bundleName.c_str());
7704             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7705         }
7706     }
7707     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
7708         additionalInfo)) {
7709         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
7710         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7711     }
7712     return ERR_OK;
7713 }
7714 
GetAdditionalInfoForAllUser(const std::string & bundleName,std::string & additionalInfo)7715 ErrCode BundleDataMgr::GetAdditionalInfoForAllUser(
7716     const std::string &bundleName, std::string &additionalInfo)
7717 {
7718     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
7719     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7720     auto infoItem = bundleInfos_.find(bundleName);
7721     if (infoItem == bundleInfos_.end()) {
7722         APP_LOGW_NOFUNC("%{public}s not exist", bundleName.c_str());
7723         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7724     }
7725     if (!DelayedSingleton<AppProvisionInfoManager>::GetInstance()->GetAdditionalInfo(bundleName,
7726         additionalInfo)) {
7727         APP_LOGW("bundleName:%{public}s GetAdditionalInfo failed", bundleName.c_str());
7728         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
7729     }
7730     return ERR_OK;
7731 }
7732 
SetExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)7733 ErrCode BundleDataMgr::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7734     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7735 {
7736     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7737     auto item = bundleInfos_.find(bundleName);
7738     if (item == bundleInfos_.end()) {
7739         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7740         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7741     }
7742     ErrCode ret;
7743     if (!extName.empty()) {
7744         ret = item->second.SetExtName(moduleName, abilityName, extName);
7745         if (ret != ERR_OK) {
7746             APP_LOGD("set ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7747             return ret;
7748         }
7749     }
7750     if (!mimeType.empty()) {
7751         ret = item->second.SetMimeType(moduleName, abilityName, mimeType);
7752         if (ret != ERR_OK) {
7753             APP_LOGD("set mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7754             return ret;
7755         }
7756     }
7757     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7758         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7759         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7760     }
7761     return ERR_OK;
7762 }
7763 
DelExtNameOrMIMEToApp(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const std::string & extName,const std::string & mimeType)7764 ErrCode BundleDataMgr::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
7765     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
7766 {
7767     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
7768     auto item = bundleInfos_.find(bundleName);
7769     if (item == bundleInfos_.end()) {
7770         APP_LOGW("bundleName %{public}s not exist", bundleName.c_str());
7771         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7772     }
7773     ErrCode ret;
7774     if (!extName.empty()) {
7775         ret = item->second.DelExtName(moduleName, abilityName, extName);
7776         if (ret != ERR_OK) {
7777             APP_LOGD("delete ext name to app failed, bundleName:%{public}s", bundleName.c_str());
7778             return ret;
7779         }
7780     }
7781     if (!mimeType.empty()) {
7782         ret = item->second.DelMimeType(moduleName, abilityName, mimeType);
7783         if (ret != ERR_OK) {
7784             APP_LOGD("delete mime type to app failed, bundleName:%{public}s", bundleName.c_str());
7785             return ret;
7786         }
7787     }
7788     if (!dataStorage_->SaveStorageBundleInfo(item->second)) {
7789         APP_LOGE("SaveStorageBundleInfo failed, bundleName:%{public}s", bundleName.c_str());
7790         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7791     }
7792     return ERR_OK;
7793 }
7794 
MatchPrivateType(const Want & want,const std::vector<std::string> & supportExtNames,const std::vector<std::string> & supportMimeTypes,const std::vector<std::string> & paramMimeTypes) const7795 bool BundleDataMgr::MatchPrivateType(const Want &want,
7796     const std::vector<std::string> &supportExtNames, const std::vector<std::string> &supportMimeTypes,
7797     const std::vector<std::string> &paramMimeTypes) const
7798 {
7799     std::string uri = want.GetUriString();
7800     APP_LOGD("MatchPrivateType, uri is %{private}s", uri.c_str());
7801     auto suffixIndex = uri.rfind('.');
7802     if (suffixIndex == std::string::npos) {
7803         return false;
7804     }
7805     std::string suffix = uri.substr(suffixIndex + 1);
7806     bool supportPrivateType = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&](const auto &extName) {
7807         return extName == suffix;
7808     });
7809     if (supportPrivateType) {
7810         APP_LOGI("uri is a supported private-type file");
7811         return true;
7812     }
7813 
7814     if (!paramMimeTypes.empty()) {
7815         auto iter = std::find_first_of(
7816             paramMimeTypes.begin(), paramMimeTypes.end(), supportMimeTypes.begin(), supportMimeTypes.end());
7817         if (iter != paramMimeTypes.end()) {
7818             APP_LOGI("uri is a supported mime-type file");
7819             return true;
7820         }
7821     }
7822     return false;
7823 }
7824 
QueryAppGalleryAbilityName(std::string & bundleName,std::string & abilityName)7825 bool BundleDataMgr::QueryAppGalleryAbilityName(std::string &bundleName, std::string &abilityName)
7826 {
7827     APP_LOGD("QueryAppGalleryAbilityName called");
7828     AbilityInfo abilityInfo;
7829     ExtensionAbilityInfo extensionInfo;
7830     Want want;
7831     want.SetAction(FREE_INSTALL_ACTION);
7832     if (!ImplicitQueryInfoByPriority(
7833         want, 0, Constants::ANY_USERID, abilityInfo, extensionInfo)) {
7834         APP_LOGD("ImplicitQueryInfoByPriority for action %{public}s failed", FREE_INSTALL_ACTION);
7835         return false;
7836     }
7837     if (!abilityInfo.name.empty()) {
7838         bundleName = abilityInfo.bundleName;
7839         abilityName = abilityInfo.name;
7840     } else {
7841         bundleName = extensionInfo.bundleName;
7842         abilityName = extensionInfo.name;
7843     }
7844 
7845     if (bundleName.empty() || abilityName.empty()) {
7846         APP_LOGW("bundleName: %{public}s or abilityName: %{public}s is empty()",
7847             bundleName.c_str(), abilityName.c_str());
7848         return false;
7849     }
7850     bool isSystemApp = false;
7851     if (IsSystemApp(bundleName, isSystemApp) != ERR_OK || !isSystemApp) {
7852         APP_LOGW("%{public}s is not systemApp", bundleName.c_str());
7853         bundleName.clear();
7854         abilityName.clear();
7855         return false;
7856     }
7857     APP_LOGD("QueryAppGalleryAbilityName bundleName: %{public}s, abilityName: %{public}s",
7858         bundleName.c_str(), abilityName.c_str());
7859     return true;
7860 }
7861 
GetJsonProfile(ProfileType profileType,const std::string & bundleName,const std::string & moduleName,std::string & profile,int32_t userId) const7862 ErrCode BundleDataMgr::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
7863     const std::string &moduleName, std::string &profile, int32_t userId) const
7864 {
7865     APP_LOGD("profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s",
7866         profileType, bundleName.c_str(), moduleName.c_str());
7867     int32_t requestUserId = GetUserId(userId);
7868     if (requestUserId == Constants::INVALID_USERID) {
7869         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
7870     }
7871     auto mapItem = PROFILE_TYPE_MAP.find(profileType);
7872     if (mapItem == PROFILE_TYPE_MAP.end()) {
7873         APP_LOGE("profileType: %{public}d is invalid", profileType);
7874         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7875     }
7876     std::string profilePath = mapItem->second;
7877     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7878     const auto &item = bundleInfos_.find(bundleName);
7879     if (item == bundleInfos_.end()) {
7880         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
7881         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
7882     }
7883     const InnerBundleInfo &bundleInfo = item->second;
7884     bool isEnabled = false;
7885     int32_t responseUserId = bundleInfo.GetResponseUserId(requestUserId);
7886     ErrCode res = bundleInfo.GetApplicationEnabledV9(responseUserId, isEnabled);
7887     if (res != ERR_OK) {
7888         APP_LOGE("check application enabled failed, bundleName: %{public}s", bundleName.c_str());
7889         return res;
7890     }
7891     if (!isEnabled) {
7892         APP_LOGE("bundleName: %{public}s is disabled", bundleInfo.GetBundleName().c_str());
7893         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
7894     }
7895     std::string moduleNameTmp = moduleName;
7896     if (moduleName.empty()) {
7897         APP_LOGW("moduleName is empty, try to get profile from entry module");
7898         std::map<std::string, InnerModuleInfo> moduleInfos = bundleInfo.GetInnerModuleInfos();
7899         for (const auto &info : moduleInfos) {
7900             if (info.second.isEntry) {
7901                 moduleNameTmp = info.second.moduleName;
7902                 APP_LOGW("try to get profile from entry module: %{public}s", moduleNameTmp.c_str());
7903                 break;
7904             }
7905         }
7906     }
7907     auto moduleInfo = bundleInfo.GetInnerModuleInfoByModuleName(moduleNameTmp);
7908     if (!moduleInfo) {
7909         APP_LOGE("moduleName: %{public}s is not found", moduleNameTmp.c_str());
7910         return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST;
7911     }
7912     return GetJsonProfileByExtractor(moduleInfo->hapPath, profilePath, profile);
7913 }
7914 
GetJsonProfileByExtractor(const std::string & hapPath,const std::string & profilePath,std::string & profile) const7915 ErrCode __attribute__((no_sanitize("cfi"))) BundleDataMgr::GetJsonProfileByExtractor(const std::string &hapPath,
7916     const std::string &profilePath, std::string &profile) const
7917 {
7918     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
7919     APP_LOGD("GetJsonProfileByExtractor with hapPath %{private}s and profilePath %{private}s",
7920         hapPath.c_str(), profilePath.c_str());
7921     BundleExtractor bundleExtractor(hapPath);
7922     if (!bundleExtractor.Init()) {
7923         APP_LOGE("bundle extractor init failed");
7924         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7925     }
7926     if (!bundleExtractor.HasEntry(profilePath)) {
7927         APP_LOGD("profile not exist");
7928         return ERR_BUNDLE_MANAGER_PROFILE_NOT_EXIST;
7929     }
7930     std::stringstream profileStream;
7931     if (!bundleExtractor.ExtractByName(profilePath, profileStream)) {
7932         APP_LOGE("extract profile failed");
7933         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
7934     }
7935     profile = profileStream.str();
7936     return ERR_OK;
7937 }
7938 
QueryDataGroupInfos(const std::string & bundleName,int32_t userId,std::vector<DataGroupInfo> & infos) const7939 bool BundleDataMgr::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
7940     std::vector<DataGroupInfo> &infos) const
7941 {
7942     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7943     auto infoItem = bundleInfos_.find(bundleName);
7944     if (infoItem == bundleInfos_.end()) {
7945         APP_LOGW("bundleName: %{public}s is not existed", bundleName.c_str());
7946         return false;
7947     }
7948     auto dataGroupInfos = infoItem->second.GetDataGroupInfos();
7949     for (const auto &item : dataGroupInfos) {
7950         auto dataGroupIter = std::find_if(std::begin(item.second), std::end(item.second),
7951             [userId](const DataGroupInfo &info) {
7952             return info.userId == userId;
7953         });
7954         if (dataGroupIter != std::end(item.second)) {
7955             infos.push_back(*dataGroupIter);
7956         }
7957     }
7958     return true;
7959 }
7960 
GetGroupDir(const std::string & dataGroupId,std::string & dir,int32_t userId) const7961 bool BundleDataMgr::GetGroupDir(const std::string &dataGroupId, std::string &dir, int32_t userId) const
7962 {
7963     if (userId == Constants::UNSPECIFIED_USERID) {
7964         userId = AccountHelper::GetCurrentActiveUserId();
7965     }
7966     std::string uuid;
7967     if (BundlePermissionMgr::IsSystemApp() &&
7968         BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
7969         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
7970         for (const auto &item : bundleInfos_) {
7971             const auto &dataGroupInfos = item.second.GetDataGroupInfos();
7972             auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7973             if (dataGroupInfosIter == dataGroupInfos.end()) {
7974                 continue;
7975             }
7976             auto dataInUserIter = std::find_if(std::begin(dataGroupInfosIter->second),
7977                 std::end(dataGroupInfosIter->second),
7978                 [userId](const DataGroupInfo &info) { return info.userId == userId; });
7979             if (dataInUserIter != std::end(dataGroupInfosIter->second)) {
7980                 uuid = dataInUserIter->uuid;
7981                 break;
7982             }
7983         }
7984     } else {
7985         int32_t callingUid = IPCSkeleton::GetCallingUid();
7986         InnerBundleInfo innerBundleInfo;
7987         if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
7988             APP_LOGD("verify uid failed, callingUid is %{public}d", callingUid);
7989             return false;
7990         }
7991         const auto &dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
7992         auto dataGroupInfosIter = dataGroupInfos.find(dataGroupId);
7993         if (dataGroupInfosIter == dataGroupInfos.end()) {
7994             APP_LOGW("calling bundle do not have dataGroupId: %{public}s", dataGroupId.c_str());
7995             return false;
7996         }
7997         auto dataGroupIter = std::find_if(std::begin(dataGroupInfosIter->second), std::end(dataGroupInfosIter->second),
7998             [userId](const DataGroupInfo &info) {
7999             return info.userId == userId;
8000         });
8001         if (dataGroupIter != std::end(dataGroupInfosIter->second)) {
8002             uuid = dataGroupIter->uuid;
8003         }
8004     }
8005     if (uuid.empty()) {
8006         APP_LOGW("get uuid by data group id failed");
8007         return false;
8008     }
8009     dir = std::string(ServiceConstants::REAL_DATA_PATH) + ServiceConstants::PATH_SEPARATOR + std::to_string(userId)
8010         + ServiceConstants::DATA_GROUP_PATH + uuid;
8011     APP_LOGD("groupDir: %{private}s", dir.c_str());
8012     return true;
8013 }
8014 
CreateNewDataGroupInfo(const std::string & groupId,const int32_t userId,const DataGroupInfo & oldDataGroupInfo,DataGroupInfo & newDataGroupInfo)8015 void BundleDataMgr::CreateNewDataGroupInfo(const std::string &groupId, const int32_t userId,
8016     const DataGroupInfo &oldDataGroupInfo, DataGroupInfo &newDataGroupInfo)
8017 {
8018     newDataGroupInfo.dataGroupId = groupId;
8019     newDataGroupInfo.userId = userId;
8020 
8021     newDataGroupInfo.uuid = oldDataGroupInfo.uuid;
8022     int32_t uniqueId = oldDataGroupInfo.uid - oldDataGroupInfo.userId * Constants::BASE_USER_RANGE -
8023         DATA_GROUP_UID_OFFSET;
8024     int32_t uid = uniqueId + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8025     newDataGroupInfo.uid = uid;
8026     newDataGroupInfo.gid = uid;
8027 }
8028 
ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo & innerBundleInfo)8029 void BundleDataMgr::ProcessAllUserDataGroupInfosWhenBundleUpdate(InnerBundleInfo &innerBundleInfo)
8030 {
8031     auto dataGroupInfos = innerBundleInfo.GetDataGroupInfos();
8032     if (dataGroupInfos.empty()) {
8033         return;
8034     }
8035     for (int32_t userId : innerBundleInfo.GetUsers()) {
8036         for (const auto &dataItem : dataGroupInfos) {
8037             std::string groupId = dataItem.first;
8038             if (dataItem.second.empty()) {
8039                 APP_LOGW("id infos %{public}s empty in -n %{public}s", groupId.c_str(),
8040                     innerBundleInfo.GetBundleName().c_str());
8041                 continue;
8042             }
8043             DataGroupInfo dataGroupInfo;
8044             CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8045             innerBundleInfo.AddDataGroupInfo(groupId, dataGroupInfo);
8046             // user path can not access, need create group dir when user unlocked
8047         }
8048     }
8049 }
8050 
GenerateDataGroupUuidAndUid(DataGroupInfo & dataGroupInfo,int32_t userId,std::unordered_set<int32_t> & uniqueIdSet) const8051 void BundleDataMgr::GenerateDataGroupUuidAndUid(DataGroupInfo &dataGroupInfo, int32_t userId,
8052     std::unordered_set<int32_t> &uniqueIdSet) const
8053 {
8054     int32_t uniqueId = DATA_GROUP_INDEX_START;
8055     for (int32_t i = DATA_GROUP_INDEX_START; i < DATA_GROUP_UID_OFFSET; i++) {
8056         if (uniqueIdSet.find(i) == uniqueIdSet.end()) {
8057             uniqueId = i;
8058             break;
8059         }
8060     }
8061 
8062     int32_t uid = userId * Constants::BASE_USER_RANGE + uniqueId + DATA_GROUP_UID_OFFSET;
8063     dataGroupInfo.uid = uid;
8064     dataGroupInfo.gid = uid;
8065 
8066     std::string str = BundleUtil::GenerateUuidByKey(dataGroupInfo.dataGroupId);
8067     dataGroupInfo.uuid = str;
8068     uniqueIdSet.insert(uniqueId);
8069 }
8070 
GenerateDataGroupInfos(const std::string & bundleName,const std::unordered_set<std::string> & dataGroupIdList,int32_t userId,bool needSaveStorage)8071 void BundleDataMgr::GenerateDataGroupInfos(const std::string &bundleName,
8072     const std::unordered_set<std::string> &dataGroupIdList, int32_t userId, bool needSaveStorage)
8073 {
8074     APP_LOGD("called for user: %{public}d", userId);
8075     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8076     auto bundleInfoItem = bundleInfos_.find(bundleName);
8077     if (bundleInfoItem == bundleInfos_.end()) {
8078         APP_LOGW("%{public}s not found", bundleName.c_str());
8079         return;
8080     }
8081     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8082     for (const auto &dataItem : dataGroupInfos) {
8083         std::string oldGroupId = dataItem.first;
8084         if (dataGroupIdList.find(oldGroupId) == dataGroupIdList.end()) {
8085             bundleInfoItem->second.DeleteDataGroupInfo(oldGroupId);
8086         }
8087     }
8088     if (dataGroupIdList.empty()) {
8089         APP_LOGD("dataGroupIdList is empty");
8090         return;
8091     }
8092     std::map<std::string, std::pair<int32_t, std::string>> dataGroupIndexMap;
8093     std::unordered_set<int32_t> uniqueIdSet;
8094     GetDataGroupIndexMap(dataGroupIndexMap, uniqueIdSet);
8095     for (const std::string &groupId : dataGroupIdList) {
8096         DataGroupInfo dataGroupInfo;
8097         dataGroupInfo.dataGroupId = groupId;
8098         dataGroupInfo.userId = userId;
8099         auto iter = dataGroupIndexMap.find(groupId);
8100         if (iter != dataGroupIndexMap.end()) {
8101             dataGroupInfo.uuid = iter->second.second;
8102             int32_t uid = iter->second.first + userId * Constants::BASE_USER_RANGE + DATA_GROUP_UID_OFFSET;
8103             dataGroupInfo.uid = uid;
8104             dataGroupInfo.gid = uid;
8105         } else {
8106             // need to generate a valid uniqueId
8107             GenerateDataGroupUuidAndUid(dataGroupInfo, userId, uniqueIdSet);
8108         }
8109         bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8110     }
8111     (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8112     ProcessAllUserDataGroupInfosWhenBundleUpdate(bundleInfoItem->second);
8113     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8114         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8115     }
8116 }
8117 
GenerateNewUserDataGroupInfos(const std::string & bundleName,int32_t userId)8118 void BundleDataMgr::GenerateNewUserDataGroupInfos(const std::string &bundleName, int32_t userId)
8119 {
8120     APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8121     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8122     auto bundleInfoItem = bundleInfos_.find(bundleName);
8123     if (bundleInfoItem == bundleInfos_.end()) {
8124         APP_LOGW("%{public}s not found", bundleName.c_str());
8125         return;
8126     }
8127     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8128     if (dataGroupInfos.empty()) {
8129         return;
8130     }
8131     for (const auto &dataItem : dataGroupInfos) {
8132         std::string groupId = dataItem.first;
8133         if (dataItem.second.empty()) {
8134             APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8135             continue;
8136         }
8137         DataGroupInfo dataGroupInfo;
8138         CreateNewDataGroupInfo(groupId, userId, dataItem.second[0], dataGroupInfo);
8139         bundleInfoItem->second.AddDataGroupInfo(groupId, dataGroupInfo);
8140         //need create group dir
8141         (void)CreateAppGroupDir(bundleInfoItem->second, userId);
8142     }
8143     if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8144         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8145     }
8146 }
8147 
DeleteUserDataGroupInfos(const std::string & bundleName,int32_t userId,bool keepData)8148 void BundleDataMgr::DeleteUserDataGroupInfos(const std::string &bundleName, int32_t userId, bool keepData)
8149 {
8150     APP_LOGD("called for -b %{public}s, -u %{public}d", bundleName.c_str(), userId);
8151     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8152     auto bundleInfoItem = bundleInfos_.find(bundleName);
8153     if (bundleInfoItem == bundleInfos_.end()) {
8154         APP_LOGW("%{public}s not found", bundleName.c_str());
8155         return;
8156     }
8157     auto dataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8158     if (dataGroupInfos.empty()) {
8159         return;
8160     }
8161     std::vector<std::string> uuidList;
8162     for (const auto &dataItem : dataGroupInfos) {
8163         std::string groupId = dataItem.first;
8164         if (dataItem.second.empty()) {
8165             APP_LOGW("id infos %{public}s empty in %{public}s", groupId.c_str(), bundleName.c_str());
8166             continue;
8167         }
8168         bundleInfoItem->second.RemoveGroupInfos(userId, groupId);
8169         if (!keepData && !IsDataGroupIdExistNoLock(groupId, userId)) {
8170             uuidList.emplace_back(dataItem.second[0].uuid);
8171         }
8172     }
8173     auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8174     if (result != ERR_OK) {
8175         APP_LOGE("delete group dir failed, err %{public}d", result);
8176     }
8177     if (!dataStorage_->SaveStorageBundleInfo(bundleInfoItem->second)) {
8178         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
8179     }
8180 }
8181 
GetDataGroupIndexMap(std::map<std::string,std::pair<int32_t,std::string>> & dataGroupIndexMap,std::unordered_set<int32_t> & uniqueIdSet) const8182 void BundleDataMgr::GetDataGroupIndexMap(std::map<std::string, std::pair<int32_t, std::string>> &dataGroupIndexMap,
8183     std::unordered_set<int32_t> &uniqueIdSet) const
8184 {
8185     for (const auto &bundleInfo : bundleInfos_) {
8186         for (const auto &infoItem : bundleInfo.second.GetDataGroupInfos()) {
8187             for_each(std::begin(infoItem.second), std::end(infoItem.second), [&](const DataGroupInfo &dataGroupInfo) {
8188                 int32_t index = dataGroupInfo.uid - dataGroupInfo.userId * Constants::BASE_USER_RANGE
8189                     - DATA_GROUP_UID_OFFSET;
8190                 dataGroupIndexMap[dataGroupInfo.dataGroupId] =
8191                     std::pair<int32_t, std::string>(index, dataGroupInfo.uuid);
8192                 uniqueIdSet.insert(index);
8193             });
8194         }
8195     }
8196 }
8197 
IsShareDataGroupIdNoLock(const std::string & dataGroupId,int32_t userId) const8198 bool BundleDataMgr::IsShareDataGroupIdNoLock(const std::string &dataGroupId, int32_t userId) const
8199 {
8200     APP_LOGD("IsShareDataGroupIdNoLock, dataGroupId is %{public}s", dataGroupId.c_str());
8201     int32_t count = 0;
8202     for (const auto &info : bundleInfos_) {
8203         auto dataGroupInfos = info.second.GetDataGroupInfos();
8204         auto iter = dataGroupInfos.find(dataGroupId);
8205         if (iter == dataGroupInfos.end()) {
8206             continue;
8207         }
8208 
8209         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8210             [userId](const DataGroupInfo &dataGroupInfo) {
8211             return dataGroupInfo.userId == userId;
8212         });
8213         if (dataGroupIter == std::end(iter->second)) {
8214             continue;
8215         }
8216         count++;
8217         if (count > 1) {
8218             APP_LOGW("dataGroupId: %{public}s is shared", dataGroupId.c_str());
8219             return true;
8220         }
8221     }
8222     return false;
8223 }
8224 
IsDataGroupIdExistNoLock(const std::string & dataGroupId,int32_t userId) const8225 bool BundleDataMgr::IsDataGroupIdExistNoLock(const std::string &dataGroupId, int32_t userId) const
8226 {
8227     APP_LOGD("dataGroupId is %{public}s, user %{public}d", dataGroupId.c_str(), userId);
8228     for (const auto &info : bundleInfos_) {
8229         auto dataGroupInfos = info.second.GetDataGroupInfos();
8230         auto iter = dataGroupInfos.find(dataGroupId);
8231         if (iter == dataGroupInfos.end()) {
8232             continue;
8233         }
8234 
8235         auto dataGroupIter = std::find_if(std::begin(iter->second), std::end(iter->second),
8236             [userId](const DataGroupInfo &dataGroupInfo) {
8237             return dataGroupInfo.userId == userId;
8238         });
8239         if (dataGroupIter == std::end(iter->second)) {
8240             continue;
8241         }
8242         return true;
8243     }
8244     return false;
8245 }
8246 
DeleteGroupDirsForException(const InnerBundleInfo & oldInfo,int32_t userId) const8247 void BundleDataMgr::DeleteGroupDirsForException(const InnerBundleInfo &oldInfo, int32_t userId) const
8248 {
8249     //find ids existed in newInfo, but not in oldInfo when there is no others share this id
8250     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8251     const auto bundleInfoItem = bundleInfos_.find(oldInfo.GetBundleName());
8252     if (bundleInfoItem == bundleInfos_.end()) {
8253         APP_LOGE("find bundle %{public}s failed", oldInfo.GetBundleName().c_str());
8254         return;
8255     }
8256     auto newDataGroupInfos = bundleInfoItem->second.GetDataGroupInfos();
8257     if (newDataGroupInfos.empty()) {
8258         return;
8259     }
8260     auto oldDatagroupInfos = oldInfo.GetDataGroupInfos();
8261     std::vector<std::string> uuidList;
8262     for (const auto &newDataItem : newDataGroupInfos) {
8263         std::string newGroupId = newDataItem.first;
8264         if (newDataItem.second.empty()) {
8265             APP_LOGE("infos empty in %{public}s %{public}s", oldInfo.GetBundleName().c_str(), newGroupId.c_str());
8266             continue;
8267         }
8268         if (oldDatagroupInfos.find(newGroupId) != oldDatagroupInfos.end() ||
8269             IsShareDataGroupIdNoLock(newGroupId, userId)) {
8270             continue;
8271         }
8272         uuidList.emplace_back(newDataItem.second[0].uuid);
8273     }
8274     auto result = InstalldClient::GetInstance()->DeleteDataGroupDirs(uuidList, userId);
8275     if (result != ERR_OK) {
8276         APP_LOGE("delete group dir failed, err %{public}d", result);
8277     }
8278 }
8279 
FindAbilityInfoInBundleInfo(const InnerBundleInfo & innerBundleInfo,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo) const8280 ErrCode BundleDataMgr::FindAbilityInfoInBundleInfo(const InnerBundleInfo &innerBundleInfo,
8281     const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo) const
8282 {
8283     if (moduleName.empty()) {
8284         auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
8285         if (!ability) {
8286             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
8287         }
8288         abilityInfo = *ability;
8289         return ERR_OK;
8290     }
8291 
8292     ErrCode ret = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, abilityInfo);
8293     if (ret != ERR_OK) {
8294         APP_LOGD("%{public}s:FindAbilityInfo failed: %{public}d", innerBundleInfo.GetBundleName().c_str(), ret);
8295     }
8296     return ret;
8297 }
8298 
ScanAllBundleGroupInfo()8299 void BundleDataMgr::ScanAllBundleGroupInfo()
8300 {
8301     // valid info, key: index, value: dataGroupId
8302     std::map<int32_t, std::string> indexMap;
8303     // valid info, key: dataGroupId, value: index
8304     std::map<std::string, int32_t> groupIdMap;
8305     // invalid infos, key: bundleNames, value: dataGroupId
8306     std::map<std::string, std::set<std::string>> needProcessGroupInfoBundleNames;
8307     // invalid GroupId
8308     std::set<std::string> errorGroupIds;
8309     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
8310     for (const auto &info : bundleInfos_) {
8311         std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos = info.second.GetDataGroupInfos();
8312         if (dataGroupInfos.empty()) {
8313             continue;
8314         }
8315         for (const auto &dataGroupItem : dataGroupInfos) {
8316             std::string dataGroupId = dataGroupItem.first;
8317             if (dataGroupItem.second.empty()) {
8318                 APP_LOGW("dataGroupInfos is empty in %{public}s", dataGroupId.c_str());
8319                 continue;
8320             }
8321             int32_t groupUidIndex = dataGroupItem.second[0].uid -
8322                 dataGroupItem.second[0].userId * Constants::BASE_USER_RANGE - DATA_GROUP_UID_OFFSET;
8323             bool hasIndex = indexMap.find(groupUidIndex) != indexMap.end();
8324             if (!hasIndex && groupIdMap.find(dataGroupId) == groupIdMap.end()) {
8325                 indexMap[groupUidIndex] = dataGroupId;
8326                 groupIdMap[dataGroupId] = groupUidIndex;
8327                 continue;
8328             }
8329             if (!hasIndex && groupIdMap.find(dataGroupId) != groupIdMap.end()) {
8330                 APP_LOGW("id %{public}s has invalid index %{public}d, not index %{public}d",
8331                     dataGroupId.c_str(), groupIdMap[dataGroupId], groupUidIndex);
8332             }
8333             if (hasIndex && indexMap[groupUidIndex] == dataGroupId) {
8334                 continue;
8335             }
8336             if (hasIndex && indexMap[groupUidIndex] != dataGroupId) {
8337                 APP_LOGW("id %{public}s has invalid index %{public}d", dataGroupId.c_str(), groupUidIndex);
8338             }
8339             errorGroupIds.insert(dataGroupId);
8340             // invalid index or groupId
8341             APP_LOGW("error index %{public}d groudId %{public}s -n %{public}s",
8342                 groupUidIndex, dataGroupId.c_str(), info.first.c_str());
8343             needProcessGroupInfoBundleNames[info.first].insert(dataGroupId);
8344         }
8345     }
8346     HandleGroupIdAndIndex(errorGroupIds, indexMap, groupIdMap);
8347     if (!HandleErrorDataGroupInfos(groupIdMap, needProcessGroupInfoBundleNames)) {
8348         APP_LOGE("process bundle data group failed");
8349     }
8350 }
8351 
HandleGroupIdAndIndex(const std::set<std::string> errorGroupIds,std::map<int32_t,std::string> & indexMap,std::map<std::string,int32_t> & groupIdMap)8352 void BundleDataMgr::HandleGroupIdAndIndex(
8353     const std::set<std::string> errorGroupIds,
8354     std::map<int32_t, std::string> &indexMap,
8355     std::map<std::string, int32_t> &groupIdMap)
8356 {
8357     if (errorGroupIds.empty() || indexMap.empty() || groupIdMap.empty()) {
8358         return;
8359     }
8360     for (const auto &groupId : errorGroupIds) {
8361         if (groupIdMap.find(groupId) != groupIdMap.end()) {
8362             continue;
8363         }
8364         int32_t groupIndex = DATA_GROUP_INDEX_START;
8365         for (int32_t index = DATA_GROUP_INDEX_START; index < DATA_GROUP_UID_OFFSET; ++index) {
8366             if (indexMap.find(index) == indexMap.end()) {
8367                 groupIndex = index;
8368                 break;
8369             }
8370         }
8371         groupIdMap[groupId] = groupIndex;
8372         indexMap[groupIndex] = groupId;
8373     }
8374 }
8375 
HandleErrorDataGroupInfos(const std::map<std::string,int32_t> & groupIdMap,const std::map<std::string,std::set<std::string>> & needProcessGroupInfoBundleNames)8376 bool BundleDataMgr::HandleErrorDataGroupInfos(
8377     const std::map<std::string, int32_t> &groupIdMap,
8378     const std::map<std::string, std::set<std::string>> &needProcessGroupInfoBundleNames)
8379 {
8380     if (groupIdMap.empty() || needProcessGroupInfoBundleNames.empty()) {
8381         return true;
8382     }
8383     bool ret = true;
8384     for (const auto &item : needProcessGroupInfoBundleNames) {
8385         auto bundleInfoIter = bundleInfos_.find(item.first);
8386         if (bundleInfoIter == bundleInfos_.end()) {
8387             ret = false;
8388             continue;
8389         }
8390         std::unordered_map<std::string, std::vector<DataGroupInfo>> dataGroupInfos =
8391             bundleInfoIter->second.GetDataGroupInfos();
8392         if (dataGroupInfos.empty()) {
8393             continue;
8394         }
8395         auto userIds = bundleInfoIter->second.GetUsers();
8396         for (const auto &groudId : item.second) {
8397             auto groupIndexIter = groupIdMap.find(groudId);
8398             if (groupIndexIter == groupIdMap.end()) {
8399                 APP_LOGW("id map not found group %{public}s", groudId.c_str());
8400                 ret = false;
8401                 continue;
8402             }
8403             auto dataGroupInfoIter = dataGroupInfos.find(groudId);
8404             if ((dataGroupInfoIter == dataGroupInfos.end()) || dataGroupInfoIter->second.empty()) {
8405                 continue;
8406             }
8407             for (int32_t userId : userIds) {
8408                 DataGroupInfo dataGroupInfo;
8409                 dataGroupInfo.dataGroupId = groudId;
8410                 dataGroupInfo.userId = userId;
8411                 dataGroupInfo.uuid = dataGroupInfoIter->second[0].uuid;
8412                 int32_t uid = userId * Constants::BASE_USER_RANGE + groupIndexIter->second + DATA_GROUP_UID_OFFSET;
8413                 dataGroupInfo.uid = uid;
8414                 dataGroupInfo.gid = uid;
8415                 bundleInfoIter->second.AddDataGroupInfo(groudId, dataGroupInfo);
8416             }
8417         }
8418         if (!dataStorage_->SaveStorageBundleInfo(bundleInfoIter->second)) {
8419             APP_LOGE("SaveStorageBundleInfo bundle %{public}s failed", item.first.c_str());
8420             ret = false;
8421         }
8422     }
8423     return ret;
8424 }
8425 
8426 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
UpdateOverlayInfo(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo)8427 bool BundleDataMgr::UpdateOverlayInfo(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo)
8428 {
8429     InnerBundleInfo targetInnerBundleInfo;
8430     std::string targetBundleName = newInfo.GetTargetBundleName();
8431     auto targetInfoItem = bundleInfos_.find(targetBundleName);
8432     if (targetInfoItem != bundleInfos_.end()) {
8433         targetInnerBundleInfo = targetInfoItem->second;
8434     }
8435 
8436     if (OverlayDataMgr::GetInstance()->UpdateOverlayInfo(newInfo, oldInfo, targetInnerBundleInfo) != ERR_OK) {
8437         APP_LOGW("update overlay info failed");
8438         return false;
8439     }
8440     // storage target bundle info
8441     if (!targetInnerBundleInfo.GetBundleName().empty() &&
8442         dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8443         bundleInfos_.at(targetInnerBundleInfo.GetBundleName()) = targetInnerBundleInfo;
8444     }
8445     // build overlay connection for external overlay
8446     if (newInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8447         const auto &moduleInfos = newInfo.GetInnerModuleInfos();
8448         std::string moduleName = (moduleInfos.begin()->second).moduleName;
8449         BuildExternalOverlayConnection(moduleName, oldInfo, newInfo.GetUserId());
8450     }
8451     return true;
8452 }
8453 
ResetExternalOverlayModuleState(const std::string & bundleName,const std::string & modulePackage)8454 void BundleDataMgr::ResetExternalOverlayModuleState(const std::string &bundleName, const std::string &modulePackage)
8455 {
8456     for (auto &info : bundleInfos_) {
8457         if (info.second.GetTargetBundleName() != bundleName) {
8458             continue;
8459         }
8460         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8461         for (const auto &moduleInfo : innerModuleInfos) {
8462             if (moduleInfo.second.targetModuleName == modulePackage) {
8463                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8464                 break;
8465             }
8466         }
8467         if (!dataStorage_->SaveStorageBundleInfo(info.second)) {
8468             APP_LOGW("update storage success bundle:%{public}s", info.second.GetBundleName().c_str());
8469         }
8470     }
8471 }
8472 
BuildExternalOverlayConnection(const std::string & moduleName,InnerBundleInfo & oldInfo,int32_t userId)8473 void BundleDataMgr::BuildExternalOverlayConnection(const std::string &moduleName, InnerBundleInfo &oldInfo,
8474     int32_t userId)
8475 {
8476     APP_LOGD("start to update external overlay connection of module %{public}s under user %{public}d",
8477         moduleName.c_str(), userId);
8478     for (auto &info : bundleInfos_) {
8479         if (info.second.GetTargetBundleName() != oldInfo.GetBundleName()) {
8480             continue;
8481         }
8482         // check target bundle is preInstall application
8483         if (!oldInfo.IsPreInstallApp()) {
8484             APP_LOGW("target bundle is not preInstall application");
8485             return;
8486         }
8487 
8488         // check fingerprint of current bundle with target bundle
8489         if (oldInfo.GetCertificateFingerprint() != info.second.GetCertificateFingerprint()) {
8490             APP_LOGW("target bundle has different fingerprint with current bundle");
8491             return;
8492         }
8493         // external overlay does not support FA model
8494         if (!oldInfo.GetIsNewVersion()) {
8495             APP_LOGW("target bundle is not stage model");
8496             return;
8497         }
8498         // external overlay does not support service
8499         if (oldInfo.GetEntryInstallationFree()) {
8500             APP_LOGW("target bundle is service");
8501             return;
8502         }
8503 
8504         const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8505         std::vector<std::string> overlayModuleVec;
8506         for (const auto &moduleInfo : innerModuleInfos) {
8507             if (moduleInfo.second.targetModuleName != moduleName) {
8508                 continue;
8509             }
8510             OverlayModuleInfo overlayModuleInfo;
8511             overlayModuleInfo.bundleName = info.second.GetBundleName();
8512             overlayModuleInfo.moduleName = moduleInfo.second.moduleName;
8513             overlayModuleInfo.targetModuleName = moduleInfo.second.targetModuleName;
8514             overlayModuleInfo.hapPath = info.second.GetModuleHapPath(moduleInfo.second.moduleName);
8515             overlayModuleInfo.priority = moduleInfo.second.targetPriority;
8516             oldInfo.AddOverlayModuleInfo(overlayModuleInfo);
8517             overlayModuleVec.emplace_back(moduleInfo.second.moduleName);
8518         }
8519         std::string bundleDir;
8520         const std::string &moduleHapPath =
8521             info.second.GetModuleHapPath((innerModuleInfos.begin()->second).moduleName);
8522         OverlayDataMgr::GetInstance()->GetBundleDir(moduleHapPath, bundleDir);
8523         OverlayBundleInfo overlayBundleInfo;
8524         overlayBundleInfo.bundleName = info.second.GetBundleName();
8525         overlayBundleInfo.bundleDir = bundleDir;
8526         overlayBundleInfo.state = info.second.GetOverlayState();
8527         overlayBundleInfo.priority = info.second.GetTargetPriority();
8528         oldInfo.AddOverlayBundleInfo(overlayBundleInfo);
8529         auto userSet = GetAllUser();
8530         for (const auto &innerUserId : userSet) {
8531             for (const auto &overlayModule : overlayModuleVec) {
8532                 int32_t state = OverlayState::OVERLAY_INVALID;
8533                 info.second.GetOverlayModuleState(overlayModule, innerUserId, state);
8534                 if (state == OverlayState::OVERLAY_INVALID) {
8535                     info.second.SetOverlayModuleState(overlayModule, OVERLAY_ENABLE, innerUserId);
8536                 }
8537             }
8538         }
8539     }
8540 }
8541 
RemoveOverlayInfoAndConnection(const InnerBundleInfo & innerBundleInfo,const std::string & bundleName)8542 void BundleDataMgr::RemoveOverlayInfoAndConnection(const InnerBundleInfo &innerBundleInfo,
8543     const std::string &bundleName)
8544 {
8545     if (innerBundleInfo.GetOverlayType() == OVERLAY_EXTERNAL_BUNDLE) {
8546         std::string targetBundleName = innerBundleInfo.GetTargetBundleName();
8547         auto targetInfoItem = bundleInfos_.find(targetBundleName);
8548         if (targetInfoItem == bundleInfos_.end()) {
8549             APP_LOGW("target bundle(%{public}s) is not installed", targetBundleName.c_str());
8550         } else {
8551             InnerBundleInfo targetInnerBundleInfo = bundleInfos_.at(targetBundleName);
8552             OverlayDataMgr::GetInstance()->RemoveOverlayBundleInfo(bundleName, targetInnerBundleInfo);
8553             if (dataStorage_->SaveStorageBundleInfo(targetInnerBundleInfo)) {
8554                 APP_LOGD("update storage success bundle:%{public}s", bundleName.c_str());
8555                 bundleInfos_.at(targetBundleName) = targetInnerBundleInfo;
8556             }
8557         }
8558     }
8559 
8560     if (innerBundleInfo.GetOverlayType() == NON_OVERLAY_TYPE) {
8561         for (auto &info : bundleInfos_) {
8562             if (info.second.GetTargetBundleName() != bundleName) {
8563                 continue;
8564             }
8565             const auto &innerModuleInfos = info.second.GetInnerModuleInfos();
8566             for (const auto &moduleInfo : innerModuleInfos) {
8567                 info.second.SetOverlayModuleState(moduleInfo.second.moduleName, OverlayState::OVERLAY_INVALID);
8568             }
8569             dataStorage_->SaveStorageBundleInfo(info.second);
8570         }
8571     }
8572 }
8573 #endif
8574 
GetOldAppIds(const std::string & bundleName,std::vector<std::string> & appIds) const8575 bool BundleDataMgr::GetOldAppIds(const std::string &bundleName, std::vector<std::string> &appIds) const
8576 {
8577     if (bundleName.empty()) {
8578         APP_LOGE("bundleName is empty");
8579         return false;
8580     }
8581     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8582     auto innerBundleInfo = bundleInfos_.find(bundleName);
8583     if (innerBundleInfo == bundleInfos_.end()) {
8584         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8585         return false;
8586     }
8587     appIds = innerBundleInfo->second.GetOldAppIds();
8588     return true;
8589 }
8590 
IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo & oldInfo,const InnerBundleInfo & newInfo) const8591 bool BundleDataMgr::IsUpdateInnerBundleInfoSatisified(const InnerBundleInfo &oldInfo,
8592     const InnerBundleInfo &newInfo) const
8593 {
8594     return newInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK ||
8595         !oldInfo.HasEntry() || newInfo.HasEntry() ||
8596         (oldInfo.GetApplicationBundleType() == BundleType::ATOMIC_SERVICE &&
8597         oldInfo.GetVersionCode() < newInfo.GetVersionCode());
8598 }
8599 
GetModuleNameByBundleAndAbility(const std::string & bundleName,const std::string & abilityName)8600 std::string BundleDataMgr::GetModuleNameByBundleAndAbility(
8601     const std::string& bundleName, const std::string& abilityName)
8602 {
8603     if (bundleName.empty() || abilityName.empty()) {
8604         APP_LOGE("bundleName or abilityName is empty");
8605         return std::string();
8606     }
8607     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8608     auto innerBundleInfo = bundleInfos_.find(bundleName);
8609     if (innerBundleInfo == bundleInfos_.end()) {
8610         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8611         return std::string();
8612     }
8613     auto abilityInfo = innerBundleInfo->second.FindAbilityInfoV9(Constants::EMPTY_STRING, abilityName);
8614     if (!abilityInfo) {
8615         APP_LOGE("bundleName:%{public}s, abilityName:%{public}s can find moduleName",
8616             bundleName.c_str(), abilityName.c_str());
8617         return std::string();
8618     }
8619     return abilityInfo->moduleName;
8620 }
8621 
SetAdditionalInfo(const std::string & bundleName,const std::string & additionalInfo) const8622 ErrCode BundleDataMgr::SetAdditionalInfo(const std::string& bundleName, const std::string& additionalInfo) const
8623 {
8624     APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
8625     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8626     auto infoItem = bundleInfos_.find(bundleName);
8627     if (infoItem == bundleInfos_.end()) {
8628         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
8629         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8630     }
8631 
8632     if (infoItem->second.GetApplicationBundleType() != BundleType::SHARED) {
8633         int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(IPCSkeleton::GetCallingUid());
8634         int32_t responseUserId = infoItem->second.GetResponseUserId(userId);
8635         if (responseUserId == Constants::INVALID_USERID) {
8636             APP_LOGE("BundleName: %{public}s does not exist in current userId", bundleName.c_str());
8637             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8638         }
8639     }
8640 
8641     auto appProvisionInfoManager = DelayedSingleton<AppProvisionInfoManager>::GetInstance();
8642     if (appProvisionInfoManager == nullptr) {
8643         APP_LOGE("Failed, appProvisionInfoManager is nullptr");
8644         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8645     }
8646 
8647     if (!appProvisionInfoManager->SetAdditionalInfo(bundleName, additionalInfo)) {
8648         APP_LOGE("BundleName: %{public}s set additional info failed", bundleName.c_str());
8649         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8650     }
8651 
8652     ElementName element;
8653     element.SetBundleName(bundleName);
8654     OHOS::AAFwk::Want want;
8655     want.SetAction(BMS_EVENT_ADDITIONAL_INFO_CHANGED);
8656     want.SetElement(element);
8657     EventFwk::CommonEventData commonData { want };
8658     NotifyBundleEventCallback(commonData);
8659     return ERR_OK;
8660 }
8661 
GetAppServiceHspBundleInfo(const std::string & bundleName,BundleInfo & bundleInfo)8662 ErrCode BundleDataMgr::GetAppServiceHspBundleInfo(const std::string &bundleName, BundleInfo &bundleInfo)
8663 {
8664     APP_LOGD("start, bundleName:%{public}s", bundleName.c_str());
8665     if (bundleName.empty()) {
8666         APP_LOGE("bundleName is empty");
8667         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
8668     }
8669 
8670     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8671     auto infoItem = bundleInfos_.find(bundleName);
8672     if (infoItem == bundleInfos_.end()) {
8673         APP_LOGE("can not find bundle %{public}s", bundleName.c_str());
8674         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8675     }
8676     const InnerBundleInfo &innerBundleInfo = infoItem->second;
8677     auto res = innerBundleInfo.GetAppServiceHspInfo(bundleInfo);
8678     if (res != ERR_OK) {
8679         APP_LOGW("get hspInfo %{public}s fail", bundleName.c_str());
8680         return res;
8681     }
8682     return ERR_OK;
8683 }
8684 
ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo & innerBundleInfo,std::vector<BaseSharedBundleInfo> & baseSharedBundleInfos) const8685 void BundleDataMgr::ConvertServiceHspToSharedBundleInfo(const InnerBundleInfo &innerBundleInfo,
8686     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos) const
8687 {
8688     APP_LOGD("start");
8689     BundleInfo bundleInfo;
8690     if (innerBundleInfo.GetAppServiceHspInfo(bundleInfo) == ERR_OK) {
8691         APP_LOGD("get app service hsp bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
8692         for (const auto &hapModule : bundleInfo.hapModuleInfos) {
8693             BaseSharedBundleInfo baseSharedBundleInfo;
8694             baseSharedBundleInfo.bundleName = bundleInfo.name;
8695             baseSharedBundleInfo.moduleName = hapModule.moduleName;
8696             baseSharedBundleInfo.versionCode = bundleInfo.versionCode;
8697             baseSharedBundleInfo.nativeLibraryPath = hapModule.nativeLibraryPath;
8698             baseSharedBundleInfo.hapPath = hapModule.hapPath;
8699             baseSharedBundleInfo.compressNativeLibs = hapModule.compressNativeLibs;
8700             baseSharedBundleInfo.nativeLibraryFileNames = hapModule.nativeLibraryFileNames;
8701             baseSharedBundleInfos.emplace_back(baseSharedBundleInfo);
8702         }
8703         return;
8704     }
8705     APP_LOGW("GetAppServiceHspInfo failed, bundleName:%{public}s", innerBundleInfo.GetBundleName().c_str());
8706 }
8707 
AddAppHspBundleName(const BundleType type,const std::string & bundleName)8708 void BundleDataMgr::AddAppHspBundleName(const BundleType type, const std::string &bundleName)
8709 {
8710     if (type == BundleType::APP_SERVICE_FWK) {
8711         APP_LOGD("add app hsp bundleName:%{public}s", bundleName.c_str());
8712         std::lock_guard<std::mutex> hspLock(hspBundleNameMutex_);
8713         appServiceHspBundleName_.insert(bundleName);
8714     }
8715 }
8716 
CreateBundleDataDir(int32_t userId)8717 ErrCode BundleDataMgr::CreateBundleDataDir(int32_t userId)
8718 {
8719     APP_LOGI("with -u %{public}d begin", userId);
8720     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8721     std::vector<CreateDirParam> createDirParams;
8722     std::vector<CreateDirParam> el5Params;
8723     for (const auto &item : bundleInfos_) {
8724         const InnerBundleInfo &info = item.second;
8725         int32_t responseUserId = info.GetResponseUserId(userId);
8726         if (responseUserId == Constants::INVALID_USERID) {
8727             APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
8728                 info.GetBundleName().c_str(), userId);
8729             continue;
8730         }
8731         CreateDirParam createDirParam;
8732         createDirParam.bundleName = info.GetBundleName();
8733         createDirParam.userId = responseUserId;
8734         createDirParam.uid = info.GetUid(responseUserId);
8735         createDirParam.gid = info.GetGid(responseUserId);
8736         createDirParam.apl = info.GetAppPrivilegeLevel();
8737         createDirParam.isPreInstallApp = info.IsPreInstallApp();
8738         createDirParam.debug = info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
8739         createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
8740         createDirParam.extensionDirs = info.GetAllExtensionDirs();
8741         createDirParams.emplace_back(createDirParam);
8742 
8743         std::vector<RequestPermission> reqPermissions = info.GetAllRequestPermissions();
8744         auto it = std::find_if(reqPermissions.begin(), reqPermissions.end(), [](const RequestPermission& permission) {
8745             return permission.name == ServiceConstants::PERMISSION_PROTECT_SCREEN_LOCK_DATA;
8746         });
8747         if (it != reqPermissions.end()) {
8748             el5Params.emplace_back(createDirParam);
8749         }
8750         CreateAppGroupDir(info, responseUserId);
8751     }
8752     lock.unlock();
8753     APP_LOGI("begin create dirs");
8754     auto res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
8755     APP_LOGI("end, res %{public}d", res);
8756     CreateEl5Dir(el5Params, true);
8757     return res;
8758 }
8759 
CreateBundleDataDirWithEl(int32_t userId,DataDirEl dirEl)8760 ErrCode BundleDataMgr::CreateBundleDataDirWithEl(int32_t userId, DataDirEl dirEl)
8761 {
8762     APP_LOGI("with -u %{public}d -el %{public}d begin", userId, static_cast<uint8_t>(dirEl));
8763     std::vector<CreateDirParam> createDirParams;
8764     {
8765         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8766         for (const auto &item : bundleInfos_) {
8767             const InnerBundleInfo &info = item.second;
8768             if (!info.HasInnerBundleUserInfo(userId)) {
8769                 APP_LOGW("bundle %{public}s is not installed in user %{public}d or 0",
8770                     info.GetBundleName().c_str(), userId);
8771                 continue;
8772             }
8773             if (dirEl == DataDirEl::EL5 && !info.NeedCreateEl5Dir()) {
8774                 continue;
8775             }
8776             CreateDirParam createDirParam;
8777             createDirParam.bundleName = info.GetBundleName();
8778             createDirParam.userId = userId;
8779             createDirParam.uid = info.GetUid(userId);
8780             createDirParam.gid = info.GetGid(userId);
8781             createDirParam.apl = info.GetAppPrivilegeLevel();
8782             createDirParam.isPreInstallApp = info.IsPreInstallApp();
8783             createDirParam.debug =
8784                 info.GetBaseApplicationInfo().appProvisionType == Constants::APP_PROVISION_TYPE_DEBUG;
8785             createDirParam.extensionDirs = info.GetAllExtensionDirs();
8786             createDirParam.createDirFlag = CreateDirFlag::CREATE_DIR_UNLOCKED;
8787             createDirParam.dataDirEl = dirEl;
8788             createDirParams.emplace_back(createDirParam);
8789             CreateAppGroupDir(info, userId);
8790         }
8791     }
8792     ErrCode res = ERR_OK;
8793     if (dirEl != DataDirEl::EL5) {
8794         res = InstalldClient::GetInstance()->CreateBundleDataDirWithVector(createDirParams);
8795     } else {
8796         CreateEl5Dir(createDirParams, true);
8797     }
8798     APP_LOGI("with -u %{public}d -el %{public}d end", userId, static_cast<uint8_t>(dirEl));
8799     return res;
8800 }
8801 
CreateEl5Dir(const std::vector<CreateDirParam> & el5Params,bool needSaveStorage)8802 void BundleDataMgr::CreateEl5Dir(const std::vector<CreateDirParam> &el5Params, bool needSaveStorage)
8803 {
8804     for (const auto &el5Param : el5Params) {
8805         APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
8806             el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
8807         InnerCreateEl5Dir(el5Param);
8808         SetEl5DirPolicy(el5Param, needSaveStorage);
8809     }
8810 }
8811 
CreateEl5DirNoCache(const std::vector<CreateDirParam> & el5Params,InnerBundleInfo & info)8812 void BundleDataMgr::CreateEl5DirNoCache(const std::vector<CreateDirParam> &el5Params, InnerBundleInfo &info)
8813 {
8814     for (const auto &el5Param : el5Params) {
8815         APP_LOGI("-n %{public}s -u %{public}d -i %{public}d",
8816             el5Param.bundleName.c_str(), el5Param.userId, el5Param.appIndex);
8817         InnerCreateEl5Dir(el5Param);
8818         SetEl5DirPolicy(el5Param, info);
8819     }
8820 }
8821 
GetUidByBundleName(const std::string & bundleName,int32_t userId,int32_t appIndex) const8822 int32_t BundleDataMgr::GetUidByBundleName(const std::string &bundleName, int32_t userId, int32_t appIndex) const
8823 {
8824     if (bundleName.empty()) {
8825         APP_LOGW("bundleName is empty");
8826         return Constants::INVALID_UID;
8827     }
8828 
8829     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8830     auto infoItem = bundleInfos_.find(bundleName);
8831     if (infoItem == bundleInfos_.end()) {
8832         APP_LOGW_NOFUNC("FetchInnerBundleInfo not found %{public}s", bundleName.c_str());
8833         return Constants::INVALID_UID;
8834     }
8835     const InnerBundleInfo &innerBundleInfo = infoItem->second;
8836     if (userId == Constants::UNSPECIFIED_USERID) {
8837         userId = GetUserIdByCallingUid();
8838     }
8839     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
8840     return innerBundleInfo.GetUid(responseUserId, appIndex);
8841 }
8842 
InnerCreateEl5Dir(const CreateDirParam & el5Param)8843 void BundleDataMgr::InnerCreateEl5Dir(const CreateDirParam &el5Param)
8844 {
8845     std::string parentDir = std::string(ServiceConstants::SCREEN_LOCK_FILE_DATA_PATH) +
8846         ServiceConstants::PATH_SEPARATOR + std::to_string(el5Param.userId);
8847     if (!BundleUtil::IsExistDir(parentDir)) {
8848         APP_LOGE("parent dir(%{public}s) missing: el5", parentDir.c_str());
8849         return;
8850     }
8851     std::vector<std::string> dirs;
8852     std::string bundleNameDir = el5Param.bundleName;
8853     if (el5Param.appIndex > 0) {
8854         bundleNameDir = BundleCloneCommonHelper::GetCloneDataDir(el5Param.bundleName, el5Param.appIndex);
8855     }
8856     dirs.emplace_back(parentDir + ServiceConstants::BASE + bundleNameDir);
8857     dirs.emplace_back(parentDir + ServiceConstants::DATABASE + bundleNameDir);
8858     for (const std::string &dir : dirs) {
8859         uint32_t mode = S_IRWXU;
8860         int32_t gid = el5Param.uid;
8861         if (dir.find(ServiceConstants::DATABASE) != std::string::npos) {
8862             mode = S_IRWXU | S_IRWXG | S_ISGID;
8863             gid = ServiceConstants::DATABASE_DIR_GID;
8864         }
8865         if (InstalldClient::GetInstance()->Mkdir(dir, mode, el5Param.uid, gid) != ERR_OK) {
8866             LOG_W(BMS_TAG_INSTALLER, "create el5 dir %{public}s failed", dir.c_str());
8867         }
8868         ErrCode result = InstalldClient::GetInstance()->SetDirApl(
8869             dir, el5Param.bundleName, el5Param.apl, el5Param.isPreInstallApp, el5Param.debug);
8870         if (result != ERR_OK) {
8871             LOG_W(BMS_TAG_INSTALLER, "fail to SetDirApl dir %{public}s, error is %{public}d", dir.c_str(), result);
8872         }
8873     }
8874 }
8875 
SetEl5DirPolicy(const CreateDirParam & el5Param,bool needSaveStorage)8876 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, bool needSaveStorage)
8877 {
8878     InnerBundleInfo info;
8879     if (!FetchInnerBundleInfo(el5Param.bundleName, info)) {
8880         LOG_E(BMS_TAG_INSTALLER, "get bundle %{public}s failed", el5Param.bundleName.c_str());
8881         return;
8882     }
8883     SetEl5DirPolicy(el5Param, info);
8884     if (!UpdateInnerBundleInfo(info, needSaveStorage)) {
8885         LOG_E(BMS_TAG_INSTALLER, "save keyId failed");
8886     }
8887 }
8888 
SetEl5DirPolicy(const CreateDirParam & el5Param,InnerBundleInfo & info)8889 void BundleDataMgr::SetEl5DirPolicy(const CreateDirParam &el5Param, InnerBundleInfo &info)
8890 {
8891     int32_t uid = el5Param.uid;
8892     std::string bundleName = info.GetBundleName();
8893     std::string keyId = "";
8894     if (el5Param.appIndex > 0) {
8895         bundleName = BundleCloneCommonHelper::GetCloneDataDir(bundleName, el5Param.appIndex);
8896     }
8897     EncryptionParam encryptionParam(bundleName, "", uid, el5Param.userId, EncryptionDirType::APP);
8898     auto result = InstalldClient::GetInstance()->SetEncryptionPolicy(encryptionParam, keyId);
8899     if (result != ERR_OK) {
8900         LOG_E(BMS_TAG_INSTALLER, "SetEncryptionPolicy failed");
8901     }
8902     LOG_D(BMS_TAG_INSTALLER, "%{public}s, keyId: %{public}s", bundleName.c_str(), keyId.c_str());
8903     info.SetkeyId(el5Param.userId, keyId, el5Param.appIndex);
8904 }
8905 
CanOpenLink(const std::string & link,bool & canOpen) const8906 ErrCode BundleDataMgr::CanOpenLink(
8907     const std::string &link, bool &canOpen) const
8908 {
8909     APP_LOGI("link: %{public}s", link.c_str());
8910     auto uid = IPCSkeleton::GetCallingUid();
8911     InnerBundleInfo innerBundleInfo;
8912     if (GetInnerBundleInfoByUid(uid, innerBundleInfo) != ERR_OK) {
8913         APP_LOGE("get innerBundleInfo by uid :%{public}d failed", uid);
8914         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8915     }
8916     auto querySchemes = innerBundleInfo.GetQuerySchemes();
8917     if (querySchemes.empty()) {
8918         APP_LOGI("querySchemes is empty");
8919         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8920     }
8921 
8922     size_t pos = link.find(SCHEME_END);
8923     if (pos == std::string::npos) {
8924         APP_LOGE("parse link : %{public}s failed", link.c_str());
8925         return ERR_BUNDLE_MANAGER_INVALID_SCHEME;
8926     }
8927     std::string scheme = link.substr(0, pos);
8928     transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
8929     if (std::find(querySchemes.begin(), querySchemes.end(), scheme) == querySchemes.end()) {
8930         APP_LOGI("scheme :%{public}s is not in the querySchemes", scheme.c_str());
8931         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8932     }
8933 
8934     Want want;
8935     want.SetUri(link);
8936     std::vector<AbilityInfo> abilityInfos;
8937     // implicit query
8938     ErrCode ret = ImplicitQueryAbilityInfosV9(
8939         want, static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_DEFAULT), GetUserIdByUid(uid), abilityInfos);
8940     if (ret != ERR_OK) {
8941         APP_LOGD("implicit queryAbilityInfosV9 error");
8942         return ERR_BUNDLE_MANAGER_SCHEME_NOT_IN_QUERYSCHEMES;
8943     }
8944 
8945     canOpen = !abilityInfos.empty();
8946     APP_LOGI("canOpen : %{public}d", canOpen);
8947     return ERR_OK;
8948 }
8949 
GenerateOdid(const std::string & developerId,std::string & odid) const8950 void BundleDataMgr::GenerateOdid(const std::string &developerId, std::string &odid) const
8951 {
8952     APP_LOGD("start, developerId:%{public}s", developerId.c_str());
8953     if (developerId.empty()) {
8954         APP_LOGE("developerId is empty");
8955         return;
8956     }
8957     std::string groupId = BundleUtil::ExtractGroupIdByDevelopId(developerId);
8958     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8959     for (const auto &item : bundleInfos_) {
8960         std::string developerIdExist;
8961         std::string odidExist;
8962         item.second.GetDeveloperidAndOdid(developerIdExist, odidExist);
8963         std::string groupIdExist = BundleUtil::ExtractGroupIdByDevelopId(developerIdExist);
8964         if (groupId == groupIdExist) {
8965             odid = odidExist;
8966             return;
8967         }
8968     }
8969     odid = BundleUtil::GenerateUuid();
8970     APP_LOGI_NOFUNC("developerId:%{public}s not existed generate odid %{private}s",
8971         developerId.c_str(), odid.c_str());
8972 }
8973 
GetOdid(std::string & odid) const8974 ErrCode BundleDataMgr::GetOdid(std::string &odid) const
8975 {
8976     int32_t callingUid = IPCSkeleton::GetCallingUid();
8977     InnerBundleInfo innerBundleInfo;
8978     if (GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8979         if (sandboxAppHelper_ == nullptr) {
8980             APP_LOGE("sandboxAppHelper_ is nullptr");
8981             return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
8982         }
8983         if (sandboxAppHelper_->GetInnerBundleInfoByUid(callingUid, innerBundleInfo) != ERR_OK) {
8984             APP_LOGW("app that corresponds to the callingUid %{public}d could not be found", callingUid);
8985             return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
8986         }
8987     }
8988     std::string developerId;
8989     innerBundleInfo.GetDeveloperidAndOdid(developerId, odid);
8990     return ERR_OK;
8991 }
8992 
GetOdidByBundleName(const std::string & bundleName,std::string & odid) const8993 ErrCode BundleDataMgr::GetOdidByBundleName(const std::string &bundleName, std::string &odid) const
8994 {
8995     APP_LOGI_NOFUNC("start GetOdidByBundleName -n %{public}s", bundleName.c_str());
8996     InnerBundleInfo innerBundleInfo;
8997     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
8998     const auto &item = bundleInfos_.find(bundleName);
8999     if (item == bundleInfos_.end()) {
9000         APP_LOGE("bundleName: %{public}s is not found", bundleName.c_str());
9001         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9002     }
9003     const InnerBundleInfo &bundleInfo = item->second;
9004     bundleInfo.GetOdid(odid);
9005     return ERR_OK;
9006 }
9007 
HandleOTACodeEncryption()9008 void BundleDataMgr::HandleOTACodeEncryption()
9009 {
9010     int32_t timerId =
9011         XCollieHelper::SetRecoveryTimer(FUNCATION_HANDLE_OTA_CODE_ENCRYPTION, OTA_CODE_ENCRYPTION_TIMEOUT);
9012     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
9013     APP_LOGI("begin");
9014     std::vector<std::string> withoutKeyBundles;
9015     std::vector<std::string> withKeyBundles;
9016     {
9017         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9018         for (const auto &item : bundleInfos_) {
9019             item.second.HandleOTACodeEncryption(withoutKeyBundles, withKeyBundles);
9020         }
9021     }
9022     for (const std::string &bundleName : withKeyBundles) {
9023         UpdateAppEncryptedStatus(bundleName, true, 0, true);
9024     }
9025     for (const std::string &bundleName : withoutKeyBundles) {
9026         UpdateAppEncryptedStatus(bundleName, false, 0, true);
9027     }
9028     APP_LOGI("end");
9029 }
9030 
ProcessAllowedAcls(const InnerBundleInfo & newInfo,InnerBundleInfo & oldInfo) const9031 void BundleDataMgr::ProcessAllowedAcls(const InnerBundleInfo &newInfo, InnerBundleInfo &oldInfo) const
9032 {
9033     if (oldInfo.GetVersionCode() < newInfo.GetVersionCode()) {
9034         oldInfo.SetAllowedAcls(newInfo.GetAllowedAcls());
9035         return;
9036     }
9037     oldInfo.AddAllowedAcls(newInfo.GetAllowedAcls());
9038 }
9039 
GetAllBundleInfoByDeveloperId(const std::string & developerId,std::vector<BundleInfo> & bundleInfos,int32_t userId)9040 ErrCode BundleDataMgr::GetAllBundleInfoByDeveloperId(const std::string &developerId,
9041     std::vector<BundleInfo> &bundleInfos, int32_t userId)
9042 {
9043     int32_t requestUserId = GetUserId(userId);
9044     APP_LOGI("requestUserId: %{public}d", requestUserId);
9045     if (requestUserId == Constants::INVALID_USERID) {
9046         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9047     }
9048 
9049     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9050     if (bundleInfos_.empty()) {
9051         APP_LOGW("bundleInfos_ data is empty");
9052         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9053     }
9054     for (const auto &item : bundleInfos_) {
9055         const InnerBundleInfo &innerBundleInfo = item.second;
9056         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9057             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9058             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9059                 innerBundleInfo.GetBundleName().c_str());
9060             continue;
9061         }
9062 
9063         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9064         auto flag = GET_BASIC_APPLICATION_INFO;
9065         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9066             continue;
9067         }
9068         // check developerId
9069         std::string developerIdExist;
9070         std::string odidExist;
9071         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9072         if (developerIdExist != developerId) {
9073             continue;
9074         }
9075 
9076         BundleInfo bundleInfo;
9077 
9078         if (innerBundleInfo.GetBundleInfoV9(static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION),
9079             bundleInfo, responseUserId) != ERR_OK) {
9080             continue;
9081         }
9082         bundleInfos.emplace_back(bundleInfo);
9083     }
9084     if (bundleInfos.empty()) {
9085         APP_LOGW("bundleInfos is empty");
9086         return ERR_BUNDLE_MANAGER_INVALID_DEVELOPERID;
9087     }
9088     APP_LOGI("have %{public}d applications, their developerId is %{public}s", requestUserId, developerId.c_str());
9089     return ERR_OK;
9090 }
9091 
GetDeveloperIds(const std::string & appDistributionType,std::vector<std::string> & developerIdList,int32_t userId)9092 ErrCode BundleDataMgr::GetDeveloperIds(const std::string &appDistributionType,
9093     std::vector<std::string> &developerIdList, int32_t userId)
9094 {
9095     int32_t requestUserId = GetUserId(userId);
9096     APP_LOGI("requestUserId: %{public}d", requestUserId);
9097     if (requestUserId == Constants::INVALID_USERID) {
9098         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9099     }
9100 
9101     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9102     if (bundleInfos_.empty()) {
9103         APP_LOGW("bundleInfos_ data is empty");
9104         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9105     }
9106     std::set<std::string> developerIdSet;
9107     for (const auto &item : bundleInfos_) {
9108         const InnerBundleInfo &innerBundleInfo = item.second;
9109         if (innerBundleInfo.GetApplicationBundleType() == BundleType::SHARED ||
9110             innerBundleInfo.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) {
9111             APP_LOGD("app %{public}s is cross-app shared bundle or appService, ignore",
9112                 innerBundleInfo.GetBundleName().c_str());
9113             continue;
9114         }
9115 
9116         int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9117         auto flag = GET_BASIC_APPLICATION_INFO;
9118         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flag, responseUserId) != ERR_OK) {
9119             continue;
9120         }
9121         // check appDistributionType
9122         if (!appDistributionType.empty() && innerBundleInfo.GetAppDistributionType() != appDistributionType) {
9123             continue;
9124         }
9125 
9126         std::string developerIdExist;
9127         std::string odidExist;
9128         innerBundleInfo.GetDeveloperidAndOdid(developerIdExist, odidExist);
9129         developerIdSet.emplace(developerIdExist);
9130     }
9131     for (const std::string &developerId : developerIdSet) {
9132         developerIdList.emplace_back(developerId);
9133     }
9134     APP_LOGI("have %{public}d developers, their appDistributionType is %{public}s",
9135         static_cast<int32_t>(developerIdList.size()), appDistributionType.c_str());
9136     return ERR_OK;
9137 }
9138 
SwitchUninstallState(const std::string & bundleName,const bool & state,const bool isNeedSendNotify,bool & stateChange)9139 ErrCode BundleDataMgr::SwitchUninstallState(const std::string &bundleName, const bool &state,
9140     const bool isNeedSendNotify, bool &stateChange)
9141 {
9142     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9143     auto infoItem = bundleInfos_.find(bundleName);
9144     if (infoItem == bundleInfos_.end()) {
9145         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9146         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9147     }
9148     InnerBundleInfo &innerBundleInfo = infoItem->second;
9149     if (!innerBundleInfo.IsRemovable() && state) {
9150         APP_LOGW("the bundle : %{public}s is not removable", bundleName.c_str());
9151         return ERR_BUNDLE_MANAGER_BUNDLE_CAN_NOT_BE_UNINSTALLED;
9152     }
9153     if (innerBundleInfo.GetUninstallState() == state) {
9154         stateChange = false;
9155         return ERR_OK;
9156     }
9157     innerBundleInfo.SetUninstallState(state);
9158     innerBundleInfo.SetNeedSendNotify(isNeedSendNotify);
9159     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9160         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9161         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9162     }
9163     stateChange = true;
9164     return ERR_OK;
9165 }
9166 
AddCloneBundle(const std::string & bundleName,const InnerBundleCloneInfo & attr)9167 ErrCode BundleDataMgr::AddCloneBundle(const std::string &bundleName, const InnerBundleCloneInfo &attr)
9168 {
9169     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9170     auto infoItem = bundleInfos_.find(bundleName);
9171     if (infoItem == bundleInfos_.end()) {
9172         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9173         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9174     }
9175     InnerBundleInfo &innerBundleInfo = infoItem->second;
9176     ErrCode res = innerBundleInfo.AddCloneBundle(attr);
9177     if (res != ERR_OK) {
9178         APP_LOGE("innerBundleInfo addCloneBundleInfo fail");
9179         return res;
9180     }
9181     APP_LOGD("update bundle info in memory for add clone, userId: %{public}d, appIndex: %{public}d",
9182         attr.userId, attr.appIndex);
9183     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9184     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9185     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9186         innerBundleInfo.SetBundleStatus(nowBundleStatus);
9187         innerBundleInfo.RemoveCloneBundle(attr.userId, attr.appIndex);
9188         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9189         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9190     }
9191     innerBundleInfo.SetBundleStatus(nowBundleStatus);
9192     APP_LOGD("update bundle info in storage for add clone, userId: %{public}d, appIndex: %{public}d",
9193         attr.userId, attr.appIndex);
9194     return ERR_OK;
9195 }
9196 
FilterAbilityInfosByAppLinking(const Want & want,int32_t flags,std::vector<AbilityInfo> & abilityInfos) const9197 void BundleDataMgr::FilterAbilityInfosByAppLinking(const Want &want, int32_t flags,
9198     std::vector<AbilityInfo> &abilityInfos) const
9199 {
9200 #ifdef APP_DOMAIN_VERIFY_ENABLED
9201     APP_LOGD("FilterAbility start");
9202     if (abilityInfos.empty()) {
9203         APP_LOGD("abilityInfos is empty");
9204         return;
9205     }
9206     if (want.GetUriString().rfind(SCHEME_HTTPS, 0) != 0) {
9207         APP_LOGD("scheme is not https");
9208         if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9209             APP_LOGI("using app linking flag and scheme is not https, return empty list");
9210             abilityInfos.clear();
9211         }
9212         return;
9213     }
9214     std::vector<AbilityInfo> filteredAbilityInfos;
9215     // call FiltedAbilityInfos
9216     APP_LOGI("call FilterAbilities");
9217     std::string identity = IPCSkeleton::ResetCallingIdentity();
9218     if (!DelayedSingleton<AppDomainVerify::AppDomainVerifyMgrClient>::GetInstance()->FilterAbilities(
9219         want, abilityInfos, filteredAbilityInfos)) {
9220         APP_LOGE("FilterAbilities failed");
9221     }
9222     IPCSkeleton::SetCallingIdentity(identity);
9223     if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9224         APP_LOGD("return filteredAbilityInfos");
9225         abilityInfos = filteredAbilityInfos;
9226         for (auto &abilityInfo : abilityInfos) {
9227             abilityInfo.linkType = LinkType::APP_LINK;
9228         }
9229         return;
9230     }
9231     for (auto &filteredAbilityInfo : filteredAbilityInfos) {
9232         for (auto &abilityInfo : abilityInfos) {
9233             if (filteredAbilityInfo.bundleName == abilityInfo.bundleName &&
9234                 filteredAbilityInfo.name == abilityInfo.name) {
9235                 abilityInfo.linkType = LinkType::APP_LINK;
9236                 break;
9237             }
9238         }
9239     }
9240     return;
9241 #else
9242     APP_LOGI("AppDomainVerify is not enabled");
9243     if (HasAppLinkingFlag(static_cast<uint32_t>(flags))) {
9244         APP_LOGI("has flag and return empty list");
9245         abilityInfos.clear();
9246     }
9247     return;
9248 #endif
9249 }
9250 
HasAppLinkingFlag(uint32_t flags)9251 bool BundleDataMgr::HasAppLinkingFlag(uint32_t flags)
9252 {
9253     return (flags & static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
9254         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING);
9255 }
9256 
RemoveCloneBundle(const std::string & bundleName,const int32_t userId,int32_t appIndex)9257 ErrCode BundleDataMgr::RemoveCloneBundle(const std::string &bundleName, const int32_t userId, int32_t appIndex)
9258 {
9259     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9260     auto infoItem = bundleInfos_.find(bundleName);
9261     if (infoItem == bundleInfos_.end()) {
9262         APP_LOGE("BundleName: %{public}s does not exist", bundleName.c_str());
9263         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9264     }
9265     InnerBundleInfo &innerBundleInfo = infoItem->second;
9266     ErrCode res = innerBundleInfo.RemoveCloneBundle(userId, appIndex);
9267     if (res != ERR_OK) {
9268         APP_LOGE("innerBundleInfo RemoveCloneBundle fail");
9269         return res;
9270     }
9271     auto nowBundleStatus = innerBundleInfo.GetBundleStatus();
9272     innerBundleInfo.SetBundleStatus(InnerBundleInfo::BundleStatus::ENABLED);
9273     if (!dataStorage_->SaveStorageBundleInfo(innerBundleInfo)) {
9274         innerBundleInfo.SetBundleStatus(nowBundleStatus);
9275         APP_LOGW("update storage failed bundle:%{public}s", bundleName.c_str());
9276         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
9277     }
9278     innerBundleInfo.SetBundleStatus(nowBundleStatus);
9279     DeleteDesktopShortcutInfo(bundleName, userId, appIndex);
9280     return ERR_OK;
9281 }
9282 
QueryAbilityInfoByContinueType(const std::string & bundleName,const std::string & continueType,AbilityInfo & abilityInfo,int32_t userId,int32_t appIndex) const9283 ErrCode BundleDataMgr::QueryAbilityInfoByContinueType(const std::string &bundleName,
9284     const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const
9285 {
9286     int32_t requestUserId = GetUserId(userId);
9287     APP_LOGI("requestUserId: %{public}d", requestUserId);
9288     if (requestUserId == Constants::INVALID_USERID) {
9289         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9290     }
9291 
9292     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9293     if (bundleInfos_.empty()) {
9294         APP_LOGW("bundleInfos_ data is empty");
9295         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9296     }
9297     InnerBundleInfo innerBundleInfo;
9298     if (appIndex == 0) {
9299         ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, 0, innerBundleInfo, requestUserId);
9300         if (ret != ERR_OK) {
9301             APP_LOGD("QueryAbilityInfoByContinueType failed, bundleName:%{public}s", bundleName.c_str());
9302             return ret;
9303         }
9304     }
9305     if (appIndex > 0) {
9306         if (sandboxAppHelper_ == nullptr) {
9307             APP_LOGW("sandboxAppHelper_ is nullptr");
9308             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9309         }
9310         auto ret = sandboxAppHelper_->GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo);
9311         if (ret != ERR_OK) {
9312             APP_LOGD("obtain innerBundleInfo of sandbox app failed due to errCode %{public}d, bundleName:%{public}s",
9313                 ret, bundleName.c_str());
9314             return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9315         }
9316     }
9317     auto ability = innerBundleInfo.FindAbilityInfo(continueType, requestUserId);
9318     if (!ability) {
9319         APP_LOGW("ability not found, bundleName:%{public}s, coutinueType:%{public}s",
9320             bundleName.c_str(), continueType.c_str());
9321         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9322     }
9323     abilityInfo = (*ability);
9324     InnerBundleUserInfo innerBundleUserInfo;
9325     if (innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
9326         abilityInfo.uid = innerBundleUserInfo.uid;
9327     }
9328     return ERR_OK;
9329 }
9330 
QueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9331 ErrCode BundleDataMgr::QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9332     int32_t appIndex, AbilityInfo &abilityInfo) const
9333 {
9334     std::string bundleName = element.GetBundleName();
9335     std::string abilityName = element.GetAbilityName();
9336     std::string moduleName = element.GetModuleName();
9337     LOG_D(BMS_TAG_QUERY,
9338         "QueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9339         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9340     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9341     int32_t requestUserId = GetUserId(userId);
9342     if (requestUserId == Constants::INVALID_USERID) {
9343         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9344     }
9345 
9346     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9347     InnerBundleInfo innerBundleInfo;
9348 
9349     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9350     if (ret != ERR_OK) {
9351         LOG_D(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9352         return ret;
9353     }
9354 
9355     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9356     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9357     if (!ability) {
9358         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9359             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9360         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9361     }
9362     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9363 }
9364 
ExplicitQueryCloneAbilityInfo(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9365 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t userId,
9366     int32_t appIndex, AbilityInfo &abilityInfo) const
9367 {
9368     std::string bundleName = element.GetBundleName();
9369     std::string abilityName = element.GetAbilityName();
9370     std::string moduleName = element.GetModuleName();
9371     LOG_D(BMS_TAG_QUERY,
9372         "ExplicitQueryCloneAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9373         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9374     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9375     int32_t requestUserId = GetUserId(userId);
9376     if (requestUserId == Constants::INVALID_USERID) {
9377         return false;
9378     }
9379     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9380     InnerBundleInfo innerBundleInfo;
9381 
9382     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9383     if (!ret) {
9384         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfo fail bundleName:%{public}s", bundleName.c_str());
9385         return false;
9386     }
9387 
9388     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9389     auto ability = innerBundleInfo.FindAbilityInfo(moduleName, abilityName, responseUserId);
9390     if (!ability) {
9391         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9392             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9393         return false;
9394     }
9395     return QueryAbilityInfoWithFlags(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9396 }
9397 
ExplicitQueryCloneAbilityInfoV9(const ElementName & element,int32_t flags,int32_t userId,int32_t appIndex,AbilityInfo & abilityInfo) const9398 ErrCode BundleDataMgr::ExplicitQueryCloneAbilityInfoV9(const ElementName &element, int32_t flags, int32_t userId,
9399     int32_t appIndex, AbilityInfo &abilityInfo) const
9400 {
9401     std::string bundleName = element.GetBundleName();
9402     std::string abilityName = element.GetAbilityName();
9403     std::string moduleName = element.GetModuleName();
9404     LOG_D(BMS_TAG_QUERY,
9405         "ExplicitQueryCloneAbilityInfoV9 bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9406         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9407     LOG_D(BMS_TAG_QUERY, "flags:%{public}d userId:%{public}d appIndex:%{public}d", flags, userId, appIndex);
9408     int32_t requestUserId = GetUserId(userId);
9409     if (requestUserId == Constants::INVALID_USERID) {
9410         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9411     }
9412     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9413     InnerBundleInfo innerBundleInfo;
9414 
9415     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9416     if (ret != ERR_OK) {
9417         LOG_D(BMS_TAG_QUERY, "ExplicitQueryCloneAbilityInfoV9 fail bundleName:%{public}s", bundleName.c_str());
9418         return ret;
9419     }
9420 
9421     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9422     auto ability = innerBundleInfo.FindAbilityInfoV9(moduleName, abilityName);
9423     if (!ability) {
9424         LOG_W(BMS_TAG_QUERY, "not found bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
9425             bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
9426         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
9427     }
9428     return QueryAbilityInfoWithFlagsV9(ability, flags, responseUserId, innerBundleInfo, abilityInfo, appIndex);
9429 }
9430 
GetCloneBundleInfo(const std::string & bundleName,int32_t flags,int32_t appIndex,BundleInfo & bundleInfo,int32_t userId) const9431 ErrCode BundleDataMgr::GetCloneBundleInfo(
9432     const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId) const
9433 {
9434     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
9435     if (userId == Constants::ANY_USERID) {
9436         if (!GetInnerBundleUserInfos(bundleName, innerBundleUserInfos)) {
9437             LOG_W(BMS_TAG_QUERY, "no userInfos for this bundle(%{public}s)", bundleName.c_str());
9438             return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9439         }
9440         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
9441     }
9442 
9443     int32_t requestUserId = GetUserId(userId);
9444     if (requestUserId == Constants::INVALID_USERID) {
9445         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9446     }
9447     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9448     InnerBundleInfo innerBundleInfo;
9449 
9450     auto ret = GetInnerBundleInfoWithBundleFlagsV9(bundleName, flags, innerBundleInfo, requestUserId, appIndex);
9451     if (ret != ERR_OK) {
9452         LOG_D(BMS_TAG_QUERY, "GetCloneBundleInfo failed, error code: %{public}d, bundleName:%{public}s",
9453             ret, bundleName.c_str());
9454         return ret;
9455     }
9456 
9457     int32_t responseUserId = innerBundleInfo.GetResponseUserId(requestUserId);
9458     innerBundleInfo.GetBundleInfoV9(flags, bundleInfo, responseUserId, appIndex);
9459 
9460     ProcessBundleMenu(bundleInfo, flags, true);
9461     ProcessBundleRouterMap(bundleInfo, flags);
9462     LOG_D(BMS_TAG_QUERY, "get bundleInfo(%{public}s) successfully in user(%{public}d)",
9463         bundleName.c_str(), userId);
9464     return ERR_OK;
9465 }
9466 
QueryAllCloneExtensionInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9467 void BundleDataMgr::QueryAllCloneExtensionInfos(const Want &want, int32_t flags, int32_t userId,
9468     std::vector<ExtensionAbilityInfo> &infos) const
9469 {
9470     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9471     int32_t requestUserId = GetUserId(userId);
9472     if (requestUserId == Constants::INVALID_USERID) {
9473         LOG_D(BMS_TAG_QUERY, "invalid user");
9474         return;
9475     }
9476 
9477     ElementName element = want.GetElement();
9478     std::string bundleName = element.GetBundleName();
9479     std::string extensionName = element.GetAbilityName();
9480     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9481         bundleName.c_str(), extensionName.c_str());
9482 
9483     if (!bundleName.empty() && !extensionName.empty()) {
9484         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9485         if (cloneAppIndexes.empty()) {
9486             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9487             return;
9488         }
9489         for (int32_t appIndex: cloneAppIndexes) {
9490             ExtensionAbilityInfo info;
9491             ErrCode ret = ExplicitQueryExtensionInfo(want, flags, requestUserId, info, appIndex);
9492             if (ret != ERR_OK) {
9493                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9494                 continue;
9495             }
9496             infos.emplace_back(info);
9497         }
9498         return;
9499     } else if (!bundleName.empty()) {
9500         ImplicitQueryCurCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9501     } else {
9502         ImplicitQueryAllCloneExtensionAbilityInfos(want, flags, requestUserId, infos);
9503     }
9504 }
9505 
QueryAllCloneExtensionInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9506 void BundleDataMgr::QueryAllCloneExtensionInfosV9(const Want &want, int32_t flags, int32_t userId,
9507     std::vector<ExtensionAbilityInfo> &infos) const
9508 {
9509     LOG_D(BMS_TAG_QUERY, "begin to ImplicitQueryAllCloneExtensionInfosV9");
9510     int32_t requestUserId = GetUserId(userId);
9511     if (requestUserId == Constants::INVALID_USERID) {
9512         LOG_D(BMS_TAG_QUERY, "invalid user");
9513         return;
9514     }
9515 
9516     ElementName element = want.GetElement();
9517     std::string bundleName = element.GetBundleName();
9518     std::string extensionName = element.GetAbilityName();
9519     LOG_D(BMS_TAG_QUERY, "bundle name:%{public}s, extension name:%{public}s",
9520         bundleName.c_str(), extensionName.c_str());
9521 
9522     if (!bundleName.empty() && !extensionName.empty()) {
9523         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexes(bundleName, userId);
9524         if (cloneAppIndexes.empty()) {
9525             LOG_D(BMS_TAG_QUERY, "explicit queryAllCloneExtensionInfo empty");
9526             return;
9527         }
9528         for (int32_t appIndex: cloneAppIndexes) {
9529             ExtensionAbilityInfo info;
9530             ErrCode ret = ExplicitQueryExtensionInfoV9(want, flags, requestUserId, info, appIndex);
9531             if (ret != ERR_OK) {
9532                 LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
9533                 continue;
9534             }
9535             infos.emplace_back(info);
9536         }
9537         return;
9538     } else if (!bundleName.empty()) {
9539         ImplicitQueryCurCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9540     } else {
9541         ImplicitQueryAllCloneExtensionAbilityInfosV9(want, flags, requestUserId, infos);
9542     }
9543 }
9544 
ImplicitQueryCurCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9545 bool BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9546     std::vector<ExtensionAbilityInfo> &abilityInfos) const
9547 {
9548     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfos");
9549     std::string bundleName = want.GetElement().GetBundleName();
9550 
9551     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9552     InnerBundleInfo innerBundleInfo;
9553     bool ret = GetInnerBundleInfoWithFlags(bundleName, flags, innerBundleInfo, userId);
9554     if (!ret) {
9555         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfos failed");
9556         return false;
9557     }
9558     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
9559     if (cloneAppIndexes.empty()) {
9560         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfos empty");
9561         return true;
9562     }
9563     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9564     for (int32_t appIndex: cloneAppIndexes) {
9565         if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9566             LOG_D(BMS_TAG_QUERY,
9567                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9568                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9569             continue;
9570         }
9571         GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
9572     }
9573     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfos");
9574     return true;
9575 }
9576 
ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & abilityInfos) const9577 ErrCode BundleDataMgr::ImplicitQueryCurCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
9578     std::vector<ExtensionAbilityInfo> &abilityInfos) const
9579 {
9580     LOG_D(BMS_TAG_QUERY, "begin ImplicitQueryCurCloneExtensionAbilityInfosV9");
9581     std::string bundleName = want.GetElement().GetBundleName();
9582 
9583     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9584     InnerBundleInfo innerBundleInfo;
9585     ErrCode ret = GetInnerBundleInfoWithFlagsV9(bundleName, flags, innerBundleInfo, userId);
9586     if (ret != ERR_OK) {
9587         LOG_D(BMS_TAG_QUERY, "ImplicitQueryCurCloneExtensionAbilityInfosV9 failed");
9588         return ret;
9589     }
9590     std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(bundleName, userId);
9591     if (cloneAppIndexes.empty()) {
9592         LOG_D(BMS_TAG_QUERY, "explicit ImplicitQueryCurCloneExtensionAbilityInfosV9 empty");
9593         return ERR_OK;
9594     }
9595     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9596     for (int32_t appIndex: cloneAppIndexes) {
9597         if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9598             LOG_D(BMS_TAG_QUERY,
9599                 "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9600                 innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9601             continue;
9602         }
9603         GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, abilityInfos, appIndex);
9604     }
9605     LOG_D(BMS_TAG_QUERY, "end ImplicitQueryCurCloneExtensionAbilityInfosV9");
9606     return ERR_OK;
9607 }
9608 
ImplicitQueryAllCloneExtensionAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9609 bool BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfos(const Want &want, int32_t flags, int32_t userId,
9610     std::vector<ExtensionAbilityInfo> &infos) const
9611 {
9612     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9613     for (const auto &item : bundleInfos_) {
9614         const InnerBundleInfo &innerBundleInfo = item.second;
9615         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
9616         if (cloneAppIndexes.empty()) {
9617             continue;
9618         }
9619         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9620         for (int32_t appIndex: cloneAppIndexes) {
9621             if (CheckInnerBundleInfoWithFlags(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9622                 LOG_D(BMS_TAG_QUERY,
9623                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9624                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9625                 continue;
9626             }
9627             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9628             GetMatchExtensionInfos(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
9629         }
9630     }
9631     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
9632     return true;
9633 }
9634 
ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos) const9635 ErrCode BundleDataMgr::ImplicitQueryAllCloneExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
9636     std::vector<ExtensionAbilityInfo> &infos) const
9637 {
9638     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9639     for (const auto &item : bundleInfos_) {
9640         const InnerBundleInfo &innerBundleInfo = item.second;
9641         std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesNoLock(innerBundleInfo.GetBundleName(), userId);
9642         if (cloneAppIndexes.empty()) {
9643             continue;
9644         }
9645         int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9646         for (int32_t appIndex: cloneAppIndexes) {
9647             if (CheckInnerBundleInfoWithFlagsV9(innerBundleInfo, flags, responseUserId, appIndex) != ERR_OK) {
9648                 LOG_D(BMS_TAG_QUERY,
9649                     "failed, bundleName:%{public}s, responseUserId:%{public}d, appIndex:%{public}d",
9650                     innerBundleInfo.GetBundleName().c_str(), responseUserId, appIndex);
9651                 continue;
9652             }
9653             int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
9654             GetMatchExtensionInfosV9(want, flags, responseUserId, innerBundleInfo, infos, appIndex);
9655         }
9656     }
9657     FilterExtensionAbilityInfosByModuleName(want.GetElement().GetModuleName(), infos);
9658     return ERR_OK;
9659 }
9660 
GetAppIdByBundleName(const std::string & bundleName,std::string & appId) const9661 ErrCode BundleDataMgr::GetAppIdByBundleName(
9662     const std::string &bundleName, std::string &appId) const
9663 {
9664     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
9665     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9666     auto item = bundleInfos_.find(bundleName);
9667     if (item == bundleInfos_.end()) {
9668         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9669     }
9670 
9671     appId = item->second.GetBaseBundleInfo().appId;
9672     return ERR_OK;
9673 }
9674 
GetSignatureInfoByBundleName(const std::string & bundleName,SignatureInfo & signatureInfo) const9675 ErrCode BundleDataMgr::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo) const
9676 {
9677     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9678     auto item = bundleInfos_.find(bundleName);
9679     if (item == bundleInfos_.end()) {
9680         LOG_E(BMS_TAG_DEFAULT, "%{public}s not exist", bundleName.c_str());
9681         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9682     }
9683     const InnerBundleInfo &innerBundleInfo = item->second;
9684     signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
9685     signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
9686     signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
9687     return ERR_OK;
9688 }
9689 
GetSignatureInfoByUid(const int32_t uid,SignatureInfo & signatureInfo) const9690 ErrCode BundleDataMgr::GetSignatureInfoByUid(const int32_t uid, SignatureInfo &signatureInfo) const
9691 {
9692     InnerBundleInfo innerBundleInfo;
9693     ErrCode errCode = GetInnerBundleInfoWithSandboxByUid(uid, innerBundleInfo);
9694     if (errCode != ERR_OK) {
9695         APP_LOGE("Get innerBundleInfo failed, uid:%{public}d", uid);
9696         return errCode;
9697     }
9698     signatureInfo.appId = innerBundleInfo.GetBaseBundleInfo().appId;
9699     signatureInfo.fingerprint = innerBundleInfo.GetBaseApplicationInfo().fingerprint;
9700     signatureInfo.appIdentifier = innerBundleInfo.GetAppIdentifier();
9701     signatureInfo.certificate = innerBundleInfo.GetCertificate();
9702     return ERR_OK;
9703 }
9704 
UpdateAppEncryptedStatus(const std::string & bundleName,bool isExisted,int32_t appIndex,bool needSaveStorage)9705 ErrCode BundleDataMgr::UpdateAppEncryptedStatus(
9706     const std::string &bundleName, bool isExisted, int32_t appIndex, bool needSaveStorage)
9707 {
9708     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9709     auto item = bundleInfos_.find(bundleName);
9710     if (item == bundleInfos_.end()) {
9711         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9712     }
9713     auto res = item->second.UpdateAppEncryptedStatus(bundleName, isExisted, appIndex);
9714     if (res != ERR_OK) {
9715         LOG_E(BMS_TAG_DEFAULT, "UpdateAppEncryptedStatus failed %{public}s %{public}d", bundleName.c_str(), res);
9716         return res;
9717     }
9718     if (dataStorage_ == nullptr) {
9719         LOG_E(BMS_TAG_DEFAULT, "dataStorage_ nullptr");
9720         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9721     }
9722     if (needSaveStorage && !dataStorage_->SaveStorageBundleInfo(item->second)) {
9723         APP_LOGE("SaveStorageBundleInfo failed for bundle %{public}s", bundleName.c_str());
9724         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
9725     }
9726     return ERR_OK;
9727 }
9728 
AddDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)9729 ErrCode BundleDataMgr::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
9730 {
9731     int32_t requestUserId = GetUserId(userId);
9732     if (requestUserId == Constants::INVALID_USERID) {
9733         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9734         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9735     }
9736     bool isEnabled = false;
9737     ErrCode ret = IsApplicationEnabled(shortcutInfo.bundleName, shortcutInfo.appIndex, isEnabled, userId);
9738     if (ret != ERR_OK) {
9739         APP_LOGD("IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
9740             ret, shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
9741         return ret;
9742     }
9743     if (!isEnabled) {
9744         APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
9745             shortcutInfo.bundleName.c_str(), shortcutInfo.appIndex, userId);
9746         return ERR_BUNDLE_MANAGER_APPLICATION_DISABLED;
9747     }
9748     bool isIdIllegal = false;
9749     if (!shortcutStorage_->AddDesktopShortcutInfo(shortcutInfo, userId, isIdIllegal)) {
9750         if (isIdIllegal) {
9751             return ERR_SHORTCUT_MANAGER_SHORTCUT_ID_ILLEGAL;
9752         }
9753         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9754     }
9755     return ERR_OK;
9756 }
9757 
DeleteDesktopShortcutInfo(const ShortcutInfo & shortcutInfo,int32_t userId)9758 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
9759 {
9760     int32_t requestUserId = GetUserId(userId);
9761     if (requestUserId == Constants::INVALID_USERID) {
9762         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9763         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9764     }
9765     if (!shortcutStorage_->DeleteDesktopShortcutInfo(shortcutInfo, userId)) {
9766         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9767     }
9768     return ERR_OK;
9769 }
9770 
GetAllDesktopShortcutInfo(int32_t userId,std::vector<ShortcutInfo> & shortcutInfos)9771 ErrCode BundleDataMgr::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
9772 {
9773     int32_t requestUserId = GetUserId(userId);
9774     if (requestUserId == Constants::INVALID_USERID) {
9775         APP_LOGW("Input invalid userid, userId:%{public}d", userId);
9776         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9777     }
9778     std::vector<ShortcutInfo> datas;
9779     shortcutStorage_->GetAllDesktopShortcutInfo(userId, datas);
9780     for (const auto &data : datas) {
9781         bool isEnabled = false;
9782         ErrCode ret = IsApplicationEnabled(data.bundleName, data.appIndex, isEnabled, userId);
9783         if (ret != ERR_OK) {
9784             APP_LOGD(
9785                 "IsApplicationEnabled ret:%{public}d, bundleName:%{public}s, appIndex:%{public}d, userId:%{public}d",
9786                 ret, data.bundleName.c_str(), data.appIndex, userId);
9787             continue;
9788         }
9789         if (!isEnabled) {
9790             APP_LOGD("BundleName: %{public}s is disabled, appIndex:%{public}d, userId:%{public}d",
9791                 data.bundleName.c_str(), data.appIndex, userId);
9792             continue;
9793         }
9794         shortcutInfos.emplace_back(data);
9795     }
9796     return ERR_OK;
9797 }
9798 
DeleteDesktopShortcutInfo(const std::string & bundleName)9799 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName)
9800 {
9801     APP_LOGD("DeleteDesktopShortcutInfo by uninstall, bundleName:%{public}s", bundleName.c_str());
9802     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName)) {
9803         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9804     }
9805     return ERR_OK;
9806 }
9807 
DeleteDesktopShortcutInfo(const std::string & bundleName,int32_t userId,int32_t appIndex)9808 ErrCode BundleDataMgr::DeleteDesktopShortcutInfo(const std::string &bundleName, int32_t userId, int32_t appIndex)
9809 {
9810     APP_LOGD(
9811         "DeleteDesktopShortcutInfo by remove cloneApp, bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d",
9812         bundleName.c_str(), userId, appIndex);
9813     if (!shortcutStorage_->DeleteDesktopShortcutInfo(bundleName, userId, appIndex)) {
9814         return ERR_SHORTCUT_MANAGER_INTERNAL_ERROR;
9815     }
9816     return ERR_OK;
9817 }
9818 
GetBundleInfosForContinuation(std::vector<BundleInfo> & bundleInfos) const9819 void BundleDataMgr::GetBundleInfosForContinuation(std::vector<BundleInfo> &bundleInfos) const
9820 {
9821     if (bundleInfos.empty()) {
9822         APP_LOGD("bundleInfos is empty");
9823         return;
9824     }
9825     bundleInfos.erase(std::remove_if(bundleInfos.begin(), bundleInfos.end(), [](BundleInfo bundleInfo) {
9826         for (auto abilityInfo : bundleInfo.abilityInfos) {
9827             if (abilityInfo.continuable) {
9828                 return false;
9829             }
9830         }
9831         return true;
9832         }), bundleInfos.end());
9833 }
9834 
GetContinueBundleNames(const std::string & continueBundleName,std::vector<std::string> & bundleNames,int32_t userId)9835 ErrCode BundleDataMgr::GetContinueBundleNames(
9836     const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
9837 {
9838     auto requestUserId = GetUserId(userId);
9839     if (requestUserId == Constants::INVALID_USERID) {
9840         APP_LOGE("Input invalid userid, userId:%{public}d", userId);
9841         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9842     }
9843     if (continueBundleName.empty()) {
9844         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
9845     }
9846 
9847     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9848     for (const auto &[key, innerInfo] : bundleInfos_) {
9849         if (CheckInnerBundleInfoWithFlags(
9850             innerInfo, BundleFlag::GET_BUNDLE_WITH_ABILITIES, innerInfo.GetResponseUserId(requestUserId)) != ERR_OK) {
9851             continue;
9852         }
9853         for (const auto &[key, abilityInfo] : innerInfo.GetInnerAbilityInfos()) {
9854             if (abilityInfo.continueBundleNames.find(continueBundleName) != abilityInfo.continueBundleNames.end()) {
9855                 bundleNames.emplace_back(abilityInfo.bundleName);
9856                 break;
9857             }
9858         }
9859     }
9860 
9861     APP_LOGD("The number of found continue packs, size:[%{public}d]", static_cast<int32_t>(bundleNames.size()));
9862     return ERR_OK;
9863 }
9864 
IsBundleInstalled(const std::string & bundleName,int32_t userId,int32_t appIndex,bool & isInstalled)9865 ErrCode BundleDataMgr::IsBundleInstalled(const std::string &bundleName, int32_t userId,
9866     int32_t appIndex, bool &isInstalled)
9867 {
9868     int32_t requestUserId = GetUserId(userId);
9869     if (requestUserId == Constants::INVALID_USERID) {
9870         APP_LOGE("name %{public}s invalid userid :%{public}d", bundleName.c_str(), userId);
9871         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
9872     }
9873     if ((appIndex < 0) || (appIndex > ServiceConstants::CLONE_APP_INDEX_MAX)) {
9874         APP_LOGE("name %{public}s invalid appIndex :%{public}d", bundleName.c_str(), appIndex);
9875         return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX;
9876     }
9877     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9878     auto item = bundleInfos_.find(bundleName);
9879     if (item == bundleInfos_.end()) {
9880         isInstalled = false;
9881         return ERR_OK;
9882     }
9883     if (item->second.GetInstallMark().status == InstallExceptionStatus::INSTALL_START) {
9884         APP_LOGW("name %{public}s is installing", bundleName.c_str());
9885         isInstalled = false;
9886         return ERR_OK;
9887     }
9888     if ((item->second.GetApplicationBundleType() == BundleType::SHARED) ||
9889         ((item->second.GetApplicationBundleType() == BundleType::APP_SERVICE_FWK) &&
9890         item->second.GetInnerBundleUserInfos().empty())) {
9891         isInstalled = true;
9892         return ERR_OK;
9893     }
9894     int32_t responseUserId = item->second.GetResponseUserId(requestUserId);
9895     if (responseUserId == Constants::INVALID_USERID) {
9896         isInstalled = false;
9897         return ERR_OK;
9898     }
9899     if (appIndex == 0) {
9900         isInstalled = true;
9901         return ERR_OK;
9902     }
9903     InnerBundleUserInfo innerBundleUserInfo;
9904     if (item->second.GetInnerBundleUserInfo(responseUserId, innerBundleUserInfo)) {
9905         if (innerBundleUserInfo.cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) !=
9906             innerBundleUserInfo.cloneInfos.end()) {
9907             isInstalled = true;
9908             return ERR_OK;
9909         }
9910     }
9911     isInstalled = false;
9912     return ERR_OK;
9913 }
9914 
UpdateIsPreInstallApp(const std::string & bundleName,bool isPreInstallApp)9915 void BundleDataMgr::UpdateIsPreInstallApp(const std::string &bundleName, bool isPreInstallApp)
9916 {
9917     APP_LOGD("UpdateIsPreInstallApp %{public}s", bundleName.c_str());
9918     if (bundleName.empty()) {
9919         APP_LOGW("bundleName is empty");
9920         return;
9921     }
9922 
9923     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
9924     auto infoItem = bundleInfos_.find(bundleName);
9925     if (infoItem == bundleInfos_.end()) {
9926         APP_LOGW("can not find bundle %{public}s", bundleName.c_str());
9927         return;
9928     }
9929 
9930     if (infoItem->second.IsPreInstallApp() != isPreInstallApp) {
9931         infoItem->second.SetIsPreInstallApp(isPreInstallApp);
9932         SaveInnerBundleInfo(infoItem->second);
9933     }
9934 }
9935 
GetBundleNameByAppId(const std::string & appId,std::string & bundleName)9936 ErrCode BundleDataMgr::GetBundleNameByAppId(const std::string &appId, std::string &bundleName)
9937 {
9938     APP_LOGD("start GetBundleNameByAppId %{private}s", appId.c_str());
9939     if (appId.empty()) {
9940         APP_LOGW("appId is empty");
9941         return ERR_APPEXECFWK_INSTALL_PARAM_ERROR;
9942     }
9943     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
9944     for (const auto &[key, innerInfo] : bundleInfos_) {
9945         if (innerInfo.GetAppId() == appId || innerInfo.GetAppIdentifier() == appId) {
9946             bundleName = key;
9947             return ERR_OK;
9948         }
9949     }
9950     APP_LOGI("get bundleName failed %{private}s", appId.c_str());
9951     return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
9952 }
9953 
GetDirForAtomicService(const std::string & bundleName,std::string & dataDir) const9954 ErrCode BundleDataMgr::GetDirForAtomicService(const std::string &bundleName, std::string &dataDir) const
9955 {
9956     APP_LOGD("start GetDirForAtomicService name: %{public}s", bundleName.c_str());
9957     AccountSA::OhosAccountInfo accountInfo;
9958     auto ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfo(accountInfo);
9959     if (ret != ERR_OK) {
9960         APP_LOGE("GetOhosAccountInfo failed, errCode: %{public}d", ret);
9961         return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
9962     }
9963     dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
9964     return ERR_OK;
9965 }
9966 
GetDirForAtomicServiceByUserId(const std::string & bundleName,int32_t userId,AccountSA::OhosAccountInfo & accountInfo,std::string & dataDir) const9967 ErrCode BundleDataMgr::GetDirForAtomicServiceByUserId(const std::string &bundleName, int32_t userId,
9968     AccountSA::OhosAccountInfo &accountInfo, std::string &dataDir) const
9969 {
9970     APP_LOGD("start GetDirForAtomicServiceByUserId name: %{public}s userId: %{public}d", bundleName.c_str(), userId);
9971     if (accountInfo.uid_.empty()) {
9972         auto ret = AccountSA::OhosAccountKits::GetInstance().GetOsAccountDistributedInfo(userId, accountInfo);
9973         if (ret != ERR_OK) {
9974             APP_LOGE("GetOsAccountDistributedInfo failed, errCode: %{public}d", ret);
9975             return ERR_BUNDLE_MANAGER_GET_ACCOUNT_INFO_FAILED;
9976         }
9977     }
9978     dataDir = ATOMIC_SERVICE_DIR_PREFIX + accountInfo.uid_ + PLUS + bundleName;
9979     return ERR_OK;
9980 }
9981 
GetDirForApp(const std::string & bundleName,const int32_t appIndex) const9982 std::string BundleDataMgr::GetDirForApp(const std::string &bundleName, const int32_t appIndex) const
9983 {
9984     APP_LOGD("start GetDirForApp name: %{public}s appIndex: %{public}d", bundleName.c_str(), appIndex);
9985     if (appIndex == 0) {
9986         return bundleName;
9987     } else {
9988         return CLONE_APP_DIR_PREFIX + std::to_string(appIndex) + PLUS + bundleName;
9989     }
9990 }
9991 
GetDirByBundleNameAndAppIndex(const std::string & bundleName,const int32_t appIndex,std::string & dataDir) const9992 ErrCode BundleDataMgr::GetDirByBundleNameAndAppIndex(const std::string &bundleName, const int32_t appIndex,
9993     std::string &dataDir) const
9994 {
9995     APP_LOGD("start GetDir bundleName : %{public}s appIndex : %{public}d", bundleName.c_str(), appIndex);
9996     if (appIndex < 0) {
9997         return ERR_BUNDLE_MANAGER_GET_DIR_INVALID_APP_INDEX;
9998     }
9999     BundleType type = BundleType::APP;
10000     GetBundleType(bundleName, type);
10001     if (type == BundleType::ATOMIC_SERVICE) {
10002         return GetDirForAtomicService(bundleName, dataDir);
10003     }
10004     dataDir = GetDirForApp(bundleName, appIndex);
10005     return ERR_OK;
10006 }
10007 
GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo & innerBundleInfo,int32_t userId) const10008 std::vector<int32_t> BundleDataMgr::GetCloneAppIndexesByInnerBundleInfo(const InnerBundleInfo &innerBundleInfo,
10009     int32_t userId) const
10010 {
10011     std::vector<int32_t> cloneAppIndexes;
10012     InnerBundleUserInfo innerBundleUserInfo;
10013     if (!innerBundleInfo.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10014         return cloneAppIndexes;
10015     }
10016     const std::map<std::string, InnerBundleCloneInfo> &cloneInfos = innerBundleUserInfo.cloneInfos;
10017     if (cloneInfos.empty()) {
10018         return cloneAppIndexes;
10019     }
10020     for (const auto &cloneInfo : cloneInfos) {
10021         LOG_D(BMS_TAG_QUERY, "get cloneAppIndexes by inner bundle info: %{public}d", cloneInfo.second.appIndex);
10022         cloneAppIndexes.emplace_back(cloneInfo.second.appIndex);
10023     }
10024     return cloneAppIndexes;
10025 }
10026 
GetBundleDir(int32_t userId,BundleType type,AccountSA::OhosAccountInfo & accountInfo,BundleDir & bundleDir) const10027 ErrCode BundleDataMgr::GetBundleDir(int32_t userId, BundleType type, AccountSA::OhosAccountInfo &accountInfo,
10028     BundleDir &bundleDir) const
10029 {
10030     APP_LOGD("start GetBundleDir");
10031     if (type == BundleType::ATOMIC_SERVICE) {
10032         std::string dataDir;
10033         auto ret = GetDirForAtomicServiceByUserId(bundleDir.bundleName, userId, accountInfo, dataDir);
10034         if (ret != ERR_OK) {
10035             return ret;
10036         }
10037         bundleDir.dir = dataDir;
10038     } else {
10039         bundleDir.dir = GetDirForApp(bundleDir.bundleName, bundleDir.appIndex);
10040     }
10041     return ERR_OK;
10042 }
10043 
GetAllBundleDirs(int32_t userId,std::vector<BundleDir> & bundleDirs) const10044 ErrCode BundleDataMgr::GetAllBundleDirs(int32_t userId, std::vector<BundleDir> &bundleDirs) const
10045 {
10046     APP_LOGD("start GetAllBundleDirs");
10047     int32_t requestUserId = GetUserId(userId);
10048     if (requestUserId == Constants::INVALID_USERID) {
10049         APP_LOGE("invalid userid :%{public}d", userId);
10050         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
10051     }
10052     AccountSA::OhosAccountInfo accountInfo;
10053     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10054     for (const auto &item : bundleInfos_) {
10055         const InnerBundleInfo &info = item.second;
10056         std::string bundleName = info.GetBundleName();
10057         int32_t responseUserId = info.GetResponseUserId(requestUserId);
10058         if (responseUserId == Constants::INVALID_USERID) {
10059             APP_LOGD("bundle %{public}s is not installed in user %{public}d or 0", bundleName.c_str(), userId);
10060             continue;
10061         }
10062         BundleType type = info.GetApplicationBundleType();
10063         if (type != BundleType::ATOMIC_SERVICE && type != BundleType::APP) {
10064             continue;
10065         }
10066 
10067         std::vector<int32_t> allAppIndexes = {0};
10068         if (type == BundleType::APP) {
10069             std::vector<int32_t> cloneAppIndexes = GetCloneAppIndexesByInnerBundleInfo(info, responseUserId);
10070             allAppIndexes.insert(allAppIndexes.end(), cloneAppIndexes.begin(), cloneAppIndexes.end());
10071         }
10072         for (int32_t appIndex: allAppIndexes) {
10073             BundleDir bundleDir;
10074             bundleDir.bundleName = bundleName;
10075             bundleDir.appIndex = appIndex;
10076             auto ret = GetBundleDir(responseUserId, type, accountInfo, bundleDir);
10077             if (ret != ERR_OK) {
10078                 return ret;
10079             }
10080             bundleDirs.emplace_back(bundleDir);
10081         }
10082     }
10083     return ERR_OK;
10084 }
10085 
RestoreUidAndGidFromUninstallInfo()10086 void BundleDataMgr::RestoreUidAndGidFromUninstallInfo()
10087 {
10088     std::unique_lock<std::shared_mutex> lock(bundleIdMapMutex_);
10089     std::map<std::string, UninstallBundleInfo> uninstallBundleInfos;
10090     if (!GetAllUninstallBundleInfo(uninstallBundleInfos)) {
10091         return;
10092     }
10093     std::map<int32_t, std::string> uninstallBundleIdMap;
10094     for (const auto &info : uninstallBundleInfos) {
10095         if (info.second.userInfos.empty()) {
10096             continue;
10097         }
10098         int32_t userId = -1;
10099         if (!OHOS::StrToInt(info.second.userInfos.begin()->first, userId)) {
10100             APP_LOGW("strToInt fail");
10101             continue;
10102         }
10103         int32_t bundleId = info.second.userInfos.begin()->second.uid
10104             - userId * Constants::BASE_USER_RANGE;
10105         if (bundleId < Constants::BASE_APP_UID || bundleId >= MAX_APP_UID) {
10106             APP_LOGW("invalid bundleId");
10107             continue;
10108         }
10109         auto item = bundleIdMap_.find(bundleId);
10110         if (item == bundleIdMap_.end()) {
10111             uninstallBundleIdMap.emplace(bundleId, info.first);
10112         }
10113     }
10114     for (const auto &item : uninstallBundleIdMap) {
10115         bundleIdMap_.emplace(item.first, item.second);
10116     }
10117 }
10118 
GetAssetAccessGroups(const std::string & bundleName,std::vector<std::string> & assetAccessGroups) const10119 ErrCode BundleDataMgr::GetAssetAccessGroups(const std::string &bundleName,
10120     std::vector<std::string> &assetAccessGroups) const
10121 {
10122     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10123     auto item = bundleInfos_.find(bundleName);
10124     if (item == bundleInfos_.end()) {
10125         APP_LOGE("%{public}s not exist", bundleName.c_str());
10126         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10127     }
10128     assetAccessGroups = item->second.GetAssetAccessGroups();
10129     return ERR_OK;
10130 }
10131 
GetDeveloperId(const std::string & bundleName,std::string & developerId) const10132 ErrCode BundleDataMgr::GetDeveloperId(const std::string &bundleName, std::string &developerId) const
10133 {
10134     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10135     auto item = bundleInfos_.find(bundleName);
10136     if (item == bundleInfos_.end()) {
10137         APP_LOGE("%{public}s not exist", bundleName.c_str());
10138         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10139     }
10140     developerId = item->second.GetDeveloperId();
10141     return ERR_OK;
10142 }
10143 
IsObtainAbilityInfo(const Want & want,int32_t userId,AbilityInfo & abilityInfo)10144 bool BundleDataMgr::IsObtainAbilityInfo(const Want &want, int32_t userId, AbilityInfo &abilityInfo)
10145 {
10146     APP_LOGI("IsObtainAbilityInfo");
10147     std::string bundleName = want.GetElement().GetBundleName();
10148     std::string abilityName = want.GetElement().GetAbilityName();
10149     std::string moduleName = want.GetElement().GetModuleName();
10150     if (bundleName.empty()) {
10151         APP_LOGE("bundle name empty");
10152         return false;
10153     }
10154     {
10155         std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10156         const auto infoItem = bundleInfos_.find(bundleName);
10157         if (infoItem == bundleInfos_.end()) {
10158             APP_LOGE("%{public}s not found", bundleName.c_str());
10159             return false;
10160         }
10161         if (abilityName.empty()) {
10162             return true;
10163         }
10164     }
10165     int32_t flags = static_cast<int32_t>(GET_ABILITY_INFO_DEFAULT);
10166     return ExplicitQueryAbilityInfo(want, flags, userId, abilityInfo);
10167 }
10168 
AddPluginInfo(const InnerBundleInfo & innerBundleInfo,const PluginBundleInfo & pluginBundleInfo,const int32_t userId)10169 ErrCode BundleDataMgr::AddPluginInfo(const InnerBundleInfo &innerBundleInfo,
10170     const PluginBundleInfo &pluginBundleInfo, const int32_t userId)
10171 {
10172     APP_LOGD("start AddPluginInfo");
10173     std::string bundleName = innerBundleInfo.GetBundleName();
10174     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
10175     auto item = bundleInfos_.find(bundleName);
10176     if (item == bundleInfos_.end()) {
10177         APP_LOGE("%{public}s not exist", bundleName.c_str());
10178         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10179     }
10180     InnerBundleInfo newInfo = item->second;
10181     if (!newInfo.AddPluginBundleInfo(pluginBundleInfo, userId)) {
10182         APP_LOGE("%{public}s add plugin info failed", bundleName.c_str());
10183         return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10184     }
10185     if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10186         APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10187         return ERR_APPEXECFWK_ADD_PLUGIN_INFO_ERROR;
10188     }
10189     bundleInfos_.at(bundleName) = newInfo;
10190     return ERR_OK;
10191 }
10192 
RemovePluginInfo(const InnerBundleInfo & innerBundleInfo,const std::string & pluginBundleName,const int32_t userId)10193 ErrCode BundleDataMgr::RemovePluginInfo(const InnerBundleInfo &innerBundleInfo,
10194     const std::string &pluginBundleName, const int32_t userId)
10195 {
10196     APP_LOGD("start RemovePluginInfo");
10197     std::string bundleName = innerBundleInfo.GetBundleName();
10198     std::unique_lock<std::shared_mutex> lock(bundleInfoMutex_);
10199     auto item = bundleInfos_.find(bundleName);
10200     if (item == bundleInfos_.end()) {
10201         APP_LOGE("%{public}s not exist", bundleName.c_str());
10202         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
10203     }
10204     InnerBundleInfo newInfo = item->second;
10205     if (!newInfo.RemovePluginBundleInfo(pluginBundleName, userId)) {
10206         APP_LOGE("%{public}s remove plugin info failed", bundleName.c_str());
10207         return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10208     }
10209     if (!dataStorage_->SaveStorageBundleInfo(newInfo)) {
10210         APP_LOGE("save InnerBundleInfo:%{public}s failed", bundleName.c_str());
10211         return ERR_APPEXECFWK_REMOVE_PLUGIN_INFO_ERROR;
10212     }
10213     bundleInfos_.at(bundleName) = newInfo;
10214     return ERR_OK;
10215 }
10216 
GetPluginBundleInfo(const std::string & hostBundleName,const std::string & pluginBundleName,PluginBundleInfo & pluginBundleInfo,const int32_t userId)10217 bool BundleDataMgr::GetPluginBundleInfo(const std::string &hostBundleName, const std::string &pluginBundleName,
10218     PluginBundleInfo &pluginBundleInfo, const int32_t userId)
10219 {
10220     APP_LOGD("bundleName:%{public}s start GetPluginBundleInfo", hostBundleName.c_str());
10221     if (hostBundleName.empty() || pluginBundleName.empty()) {
10222         APP_LOGW("bundleName is empty");
10223         return false;
10224     }
10225 
10226     std::shared_lock<std::shared_mutex> lock(bundleInfoMutex_);
10227     auto infoItem = bundleInfos_.find(hostBundleName);
10228     if (infoItem == bundleInfos_.end()) {
10229         APP_LOGW_NOFUNC("%{public}s GetPluginBundleInfo not found %{public}s", hostBundleName.c_str(),
10230             pluginBundleName.c_str());
10231         return false;
10232     }
10233 
10234     if (userId == Constants::ALL_USERID) {
10235         auto &infos = infoItem->second.GetInnerBundleUserInfos();
10236         for (auto &info : infos) {
10237             if (info.second.GetPluginBundleInfo(pluginBundleName, pluginBundleInfo)) {
10238                 APP_LOGD("%{public}s GetPluginBundleInfo success %{public}s", hostBundleName.c_str(),
10239                     pluginBundleName.c_str());
10240                 return true;
10241             }
10242         }
10243     } else {
10244         InnerBundleUserInfo innerBundleUserInfo;
10245         if (!infoItem->second.GetInnerBundleUserInfo(userId, innerBundleUserInfo)) {
10246             APP_LOGE("GetInnerBundleUserInfo failed");
10247             return false;
10248         }
10249         return innerBundleUserInfo.GetPluginBundleInfo(pluginBundleName, pluginBundleInfo);
10250     }
10251     return false;
10252 }
10253 }  // namespace AppExecFwk
10254 }  // namespace OHOS
10255